Nar*_*tor 2 scala apache-spark
我有一个架构,其中每一行包含多个数组列,并且我想彼此独立地展开每个数组列。
假设我们有以下各列:
**userId someString varA varB someBool
1 "example1" [0,2,5] [1,2,9] true
2 "example2" [1,20,5] [9,null,6] false
Run Code Online (Sandbox Code Playgroud)
我想要一个输出:
userId someString varA varB someBool
1 "example1" 0 null true
1 "example1" 2 null true
1 "example1" 5 null true
1 "example1" 1 null true
1 "example1" 20 null true
1 "example1" 5 null true
2 "example2" null 1 false
2 "example2" null 2 false
2 "example2" null 9 false
2 "example2" null 9 false
2 "example2" null null false
2 "example2" null 6 false
Run Code Online (Sandbox Code Playgroud)
有想法吗?
(哦,我正在尝试这样做,所以我不必在架构更改时更新代码,也不必因为实际的架构很大……)
PS- 我非常无耻地偷走了示例数据,为这个非常相似但又不同的问题提供了支持。
编辑:@oliik获胜,但是,看到这种方法也很棒df.flatMap(主要是因为我仍然不讨厌flatMap)
您始终可以以编程方式生成选择
val df = Seq(
(1, "example1", Seq(0,2,5), Seq(Some(1),Some(2),Some(9)), true),
(2, "example2", Seq(1,20,5), Seq(Some(9),Option.empty[Int],Some(6)), false)
).toDF("userId", "someString", "varA", "varB", "someBool")
val arrayColumns = df.schema.fields.collect {
case StructField(name, ArrayType(_, _), _, _) => name
}
val dfs = arrayColumns.map { expname =>
val columns = df.schema.fields.map {
case StructField(name, ArrayType(_, _), _, _) if expname == name => explode(df.col(name)) as name
case StructField(name, ArrayType(_, _), _, _) => lit(null) as name
case StructField(name, _, _, _) => df.col(name)
}
df.select(columns:_*)
}
dfs.reduce(_ union _).show()
Run Code Online (Sandbox Code Playgroud)
+------+----------+----+----+--------+
|userId|someString|varA|varB|someBool|
+------+----------+----+----+--------+
| 1| example1| 0|null| true|
| 1| example1| 2|null| true|
| 1| example1| 5|null| true|
| 2| example2| 1|null| false|
| 2| example2| 20|null| false|
| 2| example2| 5|null| false|
| 1| example1|null| 1| true|
| 1| example1|null| 2| true|
| 1| example1|null| 9| true|
| 2| example2|null| 9| false|
| 2| example2|null|null| false|
| 2| example2|null| 6| false|
+------+----------+----+----+--------+
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
128 次 |
| 最近记录: |