使用explode()将Java spark数据集的每个值转换为一行

使用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中的值来自

我想将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中内置的函数

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()
执行此操作,尽管更复杂、效率更低