使用explode()将Java spark数据集的每个值转换为一行
我想将spark数据集的每个值(比如“x”行和“y”列)转换为单独的行(结果应该是x*y行)和附加的列 比如说,使用explode()将Java spark数据集的每个值转换为一行,java,apache-spark,apache-spark-dataset,Java,Apache Spark,Apache Spark Dataset,我想将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中的值来自
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中内置的函数
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()
执行此操作,尽管更复杂、效率更低