首页 > 解决方案 > 组聚合中的算术减法 PySpark

问题描述

我有以下数据框:

ID val1 val2 val3 ...
1   4    1    3   ...
1   5    4    8   ...
2   6    3    6   ...
2   9    2    2   ...
3   2    1    4   ...
3   1    1    4   ...

我需要按 ID 分组/聚合并减去值,产生以下输出:

ID val1 val2 val3 ...
1   -1   -3  -5   ... 
2   -3    1   4   ...
3    1    0   0   ...

我目前的方法将一次产生 1 列所需的输出:

from pyspark.sql.functions import first, last
output = df.groupBy('id').agg(first('val1') - (last(col('val1'))))

但是,我的数据集有很多列,我需要为所有列找到一种干净的方法。

标签: pythonapache-sparkpyspark

解决方案


检查下面的代码。

df
.groupBy(col("id"))
.agg(
    (first(col("val1")) - last(col("val1"))).as("val1"),
    (first(col("val2")) - last(col("val2"))).as("val2"),
    (first(col("val3")) - last(col("val3"))).as("val3")
)
.orderBy(col("id"), ascending=True)
.show(false)
+---+----+----+----+
|id |val1|val2|val3|
+---+----+----+----+
|1  |-1  |-3  |-5  |
|2  |-3  |1   |4   |
|3  |1   |0   |0   |
+---+----+----+----+
aggCols = map(lambda c: (first(col(c)) - last(col(c))).alias(c),filter(lambda c: c != "id", df.columns))
df.groupBy(col("id")).agg(*aggCols).show()
+---+----+----+----+
| id|val1|val2|val3|
+---+----+----+----+
|  1|  -1|  -3|  -5|
|  3|   1|   0|   0|
|  2|  -3|   1|   4|
+---+----+----+----+

推荐阅读