使用 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 被迫发送与每个(“产品”, “日期”)对一个节点)。