使用 countDistinct 倾斜数据
Skew Data with countDistinct
我有一个包含 3 列的 PySpark DataFrame:'client'、'product'、'date'。我想运行一个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,每个不同的(“产品”、“日期”、“客户”)元组一行,第二个是计算每个(“产品”、“日期”)的客户数量“) 一对。这样你就不需要再担心偏差了,因为 Spark 会知道为你做部分聚合(而不是 countDistinct
被迫发送与每个(“产品”, “日期”)对一个节点)。
我有一个包含 3 列的 PySpark DataFrame:'client'、'product'、'date'。我想运行一个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,每个不同的(“产品”、“日期”、“客户”)元组一行,第二个是计算每个(“产品”、“日期”)的客户数量“) 一对。这样你就不需要再担心偏差了,因为 Spark 会知道为你做部分聚合(而不是 countDistinct
被迫发送与每个(“产品”, “日期”)对一个节点)。