首页 > 解决方案 > 如何聚合多个列并输出为行?

问题描述

我正在使用 pyspark,我有这样的数据:

col1 col2 col3
1 0 1
1 1 0
1 1 0
1 0 0

我想要的输出是:

山口
col1 4
col2 2
col3 1

我的第一个想法是将列名放在一个列表中,循环遍历它,每次对该列求和并将结果合并到一个新的 df 中。

然后我想,也许可以进行多个聚合,例如:

df.agg(sum('col1), sum('col2))

...然后找出一种方法来取消透视。

有没有更简单的方法?

标签: pythonapache-sparkpyspark

解决方案


您可以使用stackSQL 函数来取消透视数据帧,如此所述。因此,您的代码将成为input您的输入数据框:

from pyspark.sql import functions as F

output = input.agg(
  F.sum("col1").alias("col1"),
  F.sum("col2").alias("col2"),
  F.sum("col3").alias("col3")
).select(
  F.expr("stack(3, 'col1', col1, 'col2', col2, 'col3', col3) as (col,sum)")
)

如果您有以下input数据框:

+----+----+----+
|col1|col2|col3|
+----+----+----+
|1   |0   |1   |
|1   |1   |0   |
|1   |1   |0   |
|1   |0   |0   |
+----+----+----+

您将获得以下output数据框:

+----+---+
|col |sum|
+----+---+
|col1|4  |
|col2|2  |
|col3|1  |
+----+---+

推荐阅读