访问struct Spark SQL中字段的名称

时间:2017-05-27 09:01:51

标签: scala apache-spark apache-spark-sql

我正试图解除'结构的字段到数据框中的顶层,如本例所示:

case class A(a1: String, a2: String)
case class B(b1: String, b2: A)

val df = Seq(B("X",A("Y","Z"))).toDF

df.show    
+---+-----+
| b1|   b2|
+---+-----+
|  X|[Y,Z]|
+---+-----+

df.printSchema
root
 |-- b1: string (nullable = true)
 |-- b2: struct (nullable = true)
 |    |-- a1: string (nullable = true)
 |    |-- a2: string (nullable = true)

val lifted = df.withColumn("a1", $"b2.a1").withColumn("a2", $"b2.a2").drop("b2")

lifted.show
+---+---+---+
| b1| a1| a2|
+---+---+---+
|  X|  Y|  Z|
+---+---+---+

lifted.printSchema
 root
 |-- b1: string (nullable = true)
 |-- a1: string (nullable = true)
 |-- a2: string (nullable = true)

这很有效。我想创建一个小实用程序方法来为我做这个,可能是通过pimping DataFrame来启用类似df.lift(" b2")。

为此,我想我想要一种获取Struct中所有字段列表的方法。例如。给出" b2"作为输入,返回[" a1"," a2"]。我该怎么做?

2 个答案:

答案 0 :(得分:6)

如果我正确理解您的问题,您希望能够列出列b2的嵌套字段。

因此,您需要对b2进行过滤,访问StructType的{​​{1}},然后在字段(b2)中映射列的名称:< / p>

StructField

答案 1 :(得分:0)

实际上,您可以使用“ .fieldNames.toList”。

org.apache.http.**

它返回一个字符串列表。如果要创建列列表,请绘制地图。

希望对您有帮助。