将行值转换为列,其值来自 spark scala 中的另一列 [重复]

Posted

技术标签:

【中文标题】将行值转换为列,其值来自 spark scala 中的另一列 [重复]【英文标题】:Convert row values into columns with its value from another column in spark scala [duplicate] 【发布时间】:2018-10-25 04:06:51 【问题描述】:

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

输入数据框就像 -

+-----------+
| X | Y | Z |
+-----------+
| 1 | A | a |
| 2 | A | b |
| 3 | A | c |
| 1 | B | d |
| 3 | B | e |
| 2 | C | f |
+-----------+

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

+------------------------+
| Y | 1    | 2    | 3    |
+------------------------+
| A | a    | b    | c    |
| B | d    | null | e    |
| C | null | f    | null |
+------------------------+

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

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

【问题讨论】:

专门用first聚合函数。 【参考方案1】:

您可以简单地将groupBypivotfirst 一起用作聚合函数

import org.apache.spark.sql.functions._
df.groupBy("Y").pivot("X").agg(first("z")) 

输出:

+---+----+----+----+
|Y  |1   |2   |3   |
+---+----+----+----+
|B  |d   |null|e   |
|C  |null|f   |null|
|A  |a   |b   |c   |
+---+----+----+----+

【讨论】:

成功了。谢谢。 好的,接受了。 df.groupBy("Y").pivot("X").agg(first("Z"))

以上是关于将行值转换为列,其值来自 spark scala 中的另一列 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

分组后将行值显示为列-Oracle

将行值转换为火花数据框中的列数组

在 Spark SQL (pyspark) 中将行转置为列

将行值转换为列名

将行转换为列

将行数据转换为列