我的 Spark 数据帧中有一个StructType
列,我想将其拆分为多个列。
case class Struct(FIELD_1: Int, FIELD_2: Int, FIELD_3: Int)
val df = Seq(
(Struct(1,2,3), 2),
(Struct(4,5,6), 3)
).toDF("col0", "col1")
df.show()
// df: org.apache.spark.sql.DataFrame = [col0: struct<FIELD_1: int,
// FIELD_2: int ... 1 more field>, col1: int]
// +---------+----+
// | col0|col1|
// +---------+----+
// |[1, 2, 3]| 2|
// |[4, 5, 6]| 3|
// +---------+----+
将其拆分为其组成组件的一种方法是使用 .*
运算符。只是:
df.select("col0.*", "col1").show()
// +-------+-------+-------+----+
// |FIELD_1|FIELD_2|FIELD_3|col1|
// +-------+-------+-------+----+
// | 1| 2| 3| 2|
// | 4| 5| 6| 3|
// +-------+-------+-------+----+
但是,如果我想先在返回结构的列上应用一些 UDF myUDF
,那么使用 .*
方法就会变得不方便。是否有一种flattenStruct
式的方法或函数允许我执行此操作?
df.select(flattenStruct(myUDF($"col0")), "col1")
您可以先在第一个 DF 中应用 UDF,然后在下一个选择中选择使用 *? df.select(myUDF($"col0").as("col0"), "col1").select($"col0.*", "col1")