我正试图解除'结构的字段到数据框中的顶层,如本例所示:
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"]。我该怎么做?
答案 0 :(得分:6)
如果我正确理解您的问题,您希望能够列出列b2的嵌套字段。
因此,您需要对b2
进行过滤,访问StructType
的{{1}},然后在字段(b2
)中映射列的名称:< / p>
StructField
答案 1 :(得分:0)
实际上,您可以使用“ .fieldNames.toList”。
org.apache.http.**
它返回一个字符串列表。如果要创建列列表,请绘制地图。
希望对您有帮助。