使用 explode() 将 Java spark 数据集的每个值转换为一行
Convert each value of Java spark Dataset into a row using explode()
我想将 spark 数据集的每个值(比如 'x' 行和 'y' 列)转换为单独的行(结果应该是 x*y 行)和一个附加列。
例如,
ColA ColB ColC
1 2 3
4 5 6
应该生产,
NewColA NewColB
1 ColA
4 ColA
2 ColB
5 ColB
3 ColC
6 ColC
NewColB 中的值来自 NewColA 中值的原始列,即值 1 和 4 的值与 NewColB 中的 ColA 相同,因为它们最初来自 ColA,依此类推。
我在 Java 中看到了一些 explode() 函数的实现,但我想知道如何在我的用例中使用它。另请注意,输入大小可能很大(x*y 可能以百万为单位)。
完成此操作的最简单方法是使用内置于 spark sql 的 stack()
函数。
val df = Seq((1, 2, 3), (4, 5, 6)).toDF("ColA", "ColB", "ColC")
df.show()
+----+----+----+
|ColA|ColB|ColC|
+----+----+----+
| 1| 2| 3|
| 4| 5| 6|
+----+----+----+
val df2 = df.select(expr("stack(3, ColA, 'ColA', ColB, 'ColB', ColC, 'ColC') as (NewColA, NewColB)"))
df2.show()
+-------+-------+
|NewColA|NewColB|
+-------+-------+
| 1| ColA|
| 2| ColB|
| 3| ColC|
| 4| ColA|
| 5| ColB|
| 6| ColC|
+-------+-------+
抱歉,示例在 scala 中,但应该很容易翻译
用 .flatMap()
.
也可以,尽管更复杂且效率更低
我想将 spark 数据集的每个值(比如 'x' 行和 'y' 列)转换为单独的行(结果应该是 x*y 行)和一个附加列。
例如,
ColA ColB ColC
1 2 3
4 5 6
应该生产,
NewColA NewColB
1 ColA
4 ColA
2 ColB
5 ColB
3 ColC
6 ColC
NewColB 中的值来自 NewColA 中值的原始列,即值 1 和 4 的值与 NewColB 中的 ColA 相同,因为它们最初来自 ColA,依此类推。
我在 Java 中看到了一些 explode() 函数的实现,但我想知道如何在我的用例中使用它。另请注意,输入大小可能很大(x*y 可能以百万为单位)。
完成此操作的最简单方法是使用内置于 spark sql 的 stack()
函数。
val df = Seq((1, 2, 3), (4, 5, 6)).toDF("ColA", "ColB", "ColC")
df.show()
+----+----+----+
|ColA|ColB|ColC|
+----+----+----+
| 1| 2| 3|
| 4| 5| 6|
+----+----+----+
val df2 = df.select(expr("stack(3, ColA, 'ColA', ColB, 'ColB', ColC, 'ColC') as (NewColA, NewColB)"))
df2.show()
+-------+-------+
|NewColA|NewColB|
+-------+-------+
| 1| ColA|
| 2| ColB|
| 3| ColC|
| 4| ColA|
| 5| ColB|
| 6| ColC|
+-------+-------+
抱歉,示例在 scala 中,但应该很容易翻译
用 .flatMap()
.