从 Schema Scala 中提取列详细信息和类型

Extracting Column Details & Type from Schema Scala

我正在使用 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  |
+---------------+--------+

此致

马希

您可以 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|
//+-----------+--------+

试试下面的代码。

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  |
+---+--------+