首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在PySpark中计算groupby后的sum和countDistinct

在PySpark中计算groupby后的sum和countDistinct
EN

Stack Overflow用户
提问于 2021-09-16 09:53:29
回答 2查看 977关注 0票数 2

我有一个PySpark数据框架,我想按几列分组,然后计算一些列的总和,并计算另一列的不同值。因为countDistinct不是一个内置的聚合函数,所以我不能使用我在这里尝试过的简单表达式:

代码语言:javascript
运行
复制
sum_cols = ['a', 'b']
count_cols = ['id']
exprs1 = {x: "sum" for x in sum_cols}
exprs2 = {x: "countDistinct" for x in count_cols}
exprs = {**exprs1, **exprs2}

df_aggregated = df.groupby('month','product').agg(exprs)

我也以exprs2 = [countDistinct(x) for x in count_cols]的身份从this answer尝试了这种方法,但当我尝试仅对聚合列执行AssertionError: all exprs should be Column时,收到了一条错误消息。

如何在一个聚合中组合sum和count distinct?我知道,我可以对sum列做一次,对countDistinct列做一次,然后连接两个数据帧,但是应该有一个解决方案可以在一个步骤中做到这一点……

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-16 16:25:58

使用获取列列表的版本,而不是使用agg的字典版本:

代码语言:javascript
运行
复制
from pyspark.sql import functions as F
df = ...
exprs1 = [F.sum(c) for c in sum_cols]
exprs2 = [F.countDistinct(c) for c in count_cols]

df_aggregated = df.groupby('month_product').agg(*(exprs1+exprs2))

如果你想保持当前的逻辑,你可以切换到approx_count_distinct。与countDistinct不同的是,这个函数可以作为SQL函数使用。

票数 2
EN

Stack Overflow用户

发布于 2021-09-16 16:25:37

不知道为什么一定要使用expr,但正常的聚合应该可以工作。countDistinct是一个聚合函数。

代码语言:javascript
运行
复制
(df
    .groupBy('month','product')
    .agg(
        F.sum('a', 'b'),
        F.countDistinct('id')
    )
).show()

# +----+-----------+-------------+
# |name|sum(field1)|count(field1)|
# +----+-----------+-------------+
# |   d|          0|            1|
# |   c|         10|            1|
# |   b|          5|            1|
# |   a|          4|            1|
# +----+-----------+-------------+
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69206227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档