Извлечение сведений и типа столбца из схемы Scala - PullRequest
0 голосов
/ 07 мая 2020

Я использую AWS EMR v5.29.0 Spark v2.4.4 и Scala v2.11.12.

Я читаю файл с помощью метода логической схемы и создаю фрейм данных с именами столбцов и типом данных столбца имя с кодом ниже

val df = spark.read.options(Map("inferSchema"->"true","header"->"true")).csv("s3://bucket-name/File_Name.csv")
val columnList = df.schema.fields.map(field => (field.name, field.dataType.typeName)).toList.toDF("column_name","datatype")

, когда я выполняю df.printSchema (), вывод будет таким, как показано ниже.

df.printSchema()

Output:

root
 |-- ABC|EFG|IJK|LMN: string (nullable = true)

Когда я выполняю columnList.show (), вывод будет как ниже

+--------------------+--------+
|         column_name|datatype|
+--------------------+--------+
|ABC|EFG|IJK|LMN     |  string|
+--------------------+--------+

, где требуется вывод, как показано ниже.

+---------------+--------+
|column_name    |datatype|
+---------------+--------+
|ABC            |string  |
|EFG            |string  |
|IJK            |string  |
|LMN            |string  |
+---------------+--------+

С уважением

mahi

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Попробуйте код ниже.

scala> df.select(split($"column_name","\\|").as("column_name"),$"datatype").select(explode($"column_name"),$"datatype").show(false)
+---+--------+
|col|datatype|
+---+--------+
|ABC|string  |
|EFG|string  |
|IJK|string  |
|LMN|string  |
+---+--------+
1 голос
/ 07 мая 2020

Вы можете split столбец |, чтобы создать массив и расчленить фрейм данных df.

Example:

import org.apache.spark.sql.functions._

columnList.withColumn("column_name",explode(split(col("column_name"),"\\|"))).
show()
//+-----------+--------+
//|column_name|datatype|
//+-----------+--------+
//|        ABC|  string|
//|        EFG|  string|
//|        IJK|  string|
//|        LMN|  string|
//+-----------+--------+
...