pyspark - 使用 countDistinct 倾斜数据
问题描述
我有一个包含 3 列的 PySpark DataFrame:“客户”、“产品”、“日期”。我想运行 groupBy 操作:
df.groupBy("product", "date").agg(F.countDistinct("client"))
所以我想计算每天购买产品的客户数量。这会导致巨大的倾斜数据(实际上,它会因为内存而导致错误)。我一直在学习腌制技术。据我了解,它可以与“sum”或“count”一起使用,向 groupBy 添加一个新列并执行第二次聚合,但由于countDistinct
聚合方法,我不知道在这种情况下如何应用它们。
在这种情况下我该如何应用它?
解决方案
我建议不要countDistinct
在这里使用并连续使用 2 个聚合来实现您想要的效果,特别是因为您的数据存在偏差。它可能如下所示:
import pyspark.sql.functions as F
new_df = (df
.groupBy("product", "date", "client")
.agg({}) # getting unique ("product", "date", "client") tuples
.groupBy("product", "date")
.agg(F.count('*').alias('clients'))
)
这里的第一个聚合确保你有一个 DataFrame,每个不同的(“product”,“date”,“client”)元组都有一行,第二个是计算每个(“product”,“date”)对的客户端数量。这样您就不必再担心偏差了,因为 Spark 会知道为您进行部分聚合(而不是countDistinct
强制发送与每个 ("product", "date") 对相对应的所有单独的 "client" 值)到一个节点)。
推荐阅读
- r - 使用循环在R中读取和写入多个文件
- adfs - What is the default value of concurrent users can login to ADFS saml authentication?
- shopify - 公共 shopify 应用程序将如何呈现给商店访问者
- javascript - JavaScript 从异步获取中访问数据
- django - 未调用覆盖的清理函数
- python - 如何使用“matplotlib.pyplot”在不同的窗口中绘制我的图表?
- c++ - 如何在 Qt creator 4.8 中使用 C++11
- php - 将对象值替换为数组
- reactjs - 你能同时使用 React-hooks 和 redux 吗?
- c++ - 使用来自 SYSTEM 级别进程(Windows 服务)的登录用户上下文来模拟和运行任何方法: