apache-spark - 如何在pyspark数据框中的groupby之后进行条件聚合?
问题描述
我正在尝试按数据框中的 ID 列进行分组,pyspark
并根据另一列的值对一列求和。
为了说明,请考虑以下虚拟数据帧:
+-----+-------+---------+
| ID| type| amount|
+-----+-------+---------+
| 1| a| 55|
| 2| b| 1455|
| 2| a| 20|
| 2| b| 100|
| 3| null| 230|
+-----+-------+---------+
我想要的输出是:
+-----+--------+----------+----------+
| ID| sales| sales_a| sales_b|
+-----+--------+----------+----------+
| 1| 55| 55| 0|
| 2| 1575| 20| 1555|
| 3| 230| 0| 0|
+-----+--------+----------+----------+
所以基本上,sales
将是amount
,whilesales_a
和sales_b
的总和,分别是amount
whentype
是a
或的总和b
。
对于sales
,我知道这可以这样做:
from pyspark.sql import functions as F
df = df.groupBy("ID").agg(F.sum("amount").alias("sales"))
对于其他人,我猜F.when
会很有用,但我不知道该怎么做。
解决方案
您可以根据类型的值在聚合之前创建两列。
df.withColumn("sales_a", F.when(col("type") == "a", col("amount"))) \
.withColumn("sales_b", F.when(col("type") == "b", col("amount"))) \
.groupBy("ID") \
.agg(F.sum("amount").alias("sales"),
F.sum("sales_a").alias("sales_a"),
F.sum("sales_b").alias("sales_b"))
推荐阅读
- vb.net - 如何检查数据集是否包含 VB.net 中的特定值
- python - 通过 matplotlib 图表和图表上的绘图点绘制 python pandas 数据框
- reactjs - 条件封闭元素 React
- java - 如何在多对多关系中保留额外的列(属性)?
- here-api - 如何请求带标题的导航?
- android-studio - 如何在android中创建不同的语音效果?
- python - 如何在 django 上设置 timezone.now
- sql - 我已经在模型中定义了关系,但是如何以 Eloquent 的方式编写复杂的查询
- reactjs - 向 img 标签添加唯一 id 属性
- python - 如何将我们的自定义代码(将 json 转换为 csv)用于 Google 云数据流?