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 的所有可能值,然后将其连接到我的原始数据帧。这种方法效率极低。
有没有有效的方法来解决这个问题?提前致谢。
您可以简单地使用groupBywithpivot和first作为聚合函数,如下所示
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)