使用 Spark scala 中另一列的值将行值转换为列

Ish*_*han 4 scala apache-spark apache-spark-sql

我正在尝试将行中的值与其另一列中的值转换为不同的列。例如 -

输入数据框就像 -

+-----------+
| X | Y | Z |
+-----------+
| 1 | A | a |
| 2 | A | b |
| 3 | A | c |
| 1 | B | d |
| 3 | B | e |
| 2 | C | f |
+-----------+
Run Code Online (Sandbox Code Playgroud)

输出数据框应该是这样的 -

+------------------------+
| Y | 1    | 2    | 3    |
+------------------------+
| A | a    | b    | c    |
| B | d    | null | e    |
| C | null | f    | null |
+------------------------+
Run Code Online (Sandbox Code Playgroud)

我尝试对基于 Y 的值进行 groupBy 并对 X 和 Z 上的collect_list 进行分组,然后将 X 和 Z 压缩在一起以获得某种键值对。但是 Y 的某些值可能缺少一些 X,因此为了用空值填充它们,我交叉连接了 X 的所有可能值和 Y 的所有可能值,然后将其连接到我的原始数据帧。这种方法效率极低。

有没有有效的方法来解决这个问题?提前致谢。

Sha*_*ala 6

您可以简单地使用groupBywithpivotfirst作为聚合函数,如下所示

import org.apache.spark.sql.functions._
df.groupBy("Y").pivot("X").agg(first("z")) 
Run Code Online (Sandbox Code Playgroud)

输出:

+---+----+----+----+
|Y  |1   |2   |3   |
+---+----+----+----+
|B  |d   |null|e   |
|C  |null|f   |null|
|A  |a   |b   |c   |
+---+----+----+----+
Run Code Online (Sandbox Code Playgroud)