使用 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().

也可以,尽管更复杂且效率更低