PySpark - 运行 Count() / 聚合函数(平均等)时出现不一致

Posted

技术标签:

【中文标题】PySpark - 运行 Count() / 聚合函数(平均等)时出现不一致【英文标题】:PySpark - Inconsistency when running Count() / Aggregate Function (Average, etc.) 【发布时间】:2021-06-05 18:39:55 【问题描述】:

你好, 我有一个带有 ID 的数据框和该 ID 的相关季度(图像中的表 1)。一天结束时,我的目标是随机选择一个 ID,而不考虑季度。

为了随机选择一个 ID,我使用 PySpark - rand 函数添加 Random_Num 列,并设置种子值以便可以复制结果(例如:random_num = rand(seed=1234)。添加 random_num 后列(图像中的 table2),我根据 ID 和 Random_Num 对 table2 进行排序,然后使用 - dropDuplicates 函数随机选择 ID。运行 dropDuplicates 后,我会在图像中显示 table3。

在这一步之后,我会进行其他我不关心的数据处理。最后,我运行聚合函数并计算每个季度的 ID。但是,每次运行它,我都会得到不同的计数以及相关的汇总统计信息,例如平均值。例如,当我运行聚合时 - 我得到例如:季度计数 200 - 2015 年 3 月 31 日)。下一次,我运行相同的代码,我得到 210 的季度 - 2015 年 3 月 31 日。

请注意 - 我的数据框中有几百万条记录。

我的问题 - 每次我运行时这是否预期会得到不同的计数 - 因为我使用的是随机函数(我验证了具有种子值的随机函数每次都会生成相同的数字)或者还有其他一些我不知道的问题不知道。 (仅供参考 - 我是 PySpark 的新手)。

最后,我发现了两个类似的 Stack Overflow 问题,讨论的主题是缓存()或持久化()数据帧。这是唯一的解决方案吗?

感谢您提供的任何指导或帮助。

参考:

spark inconsistency when running count command

Spark re-samples my data everytime I run something related to the sample

【问题讨论】:

删除重复项不是确定性函数,在不同的运行中可能会返回不同的结果 谢谢@mck!实际上,dropduplicates 导致了差异。我想知道是否有一个列表或文档列出了所有非确定性函数。这对 PySpark 的新手很有帮助。 【参考方案1】:

删除重复项不是确定性的,每次运行都可能返回不同的结果。

如果不删除完全重复的行,则需要考虑要保留哪些行。根据目标,您可能要使用 'row_number().over(Window.partitionBy(...).orderBy(...)' 然后 'filter('row_number == 1')'

然后它的行为就像 pandas dropduplicates - 如果您查看 pandas 文档,它默认只保留重复行中的第一行。就我个人而言,我认为有一种方法可以删除 100% 重复的行而不产生开销,就像在 spark 中我们经常处理大数据一样,但这会引起一些混乱。

【讨论】:

以上是关于PySpark - 运行 Count() / 聚合函数(平均等)时出现不一致的主要内容,如果未能解决你的问题,请参考以下文章

PySpark 2.1.1 groupby + approx_count_distinct 计数为 0

Pyspark - df.cache().count() 永远运行

GROUP BY 与 PySpark SQL 中的重叠行

PySpark .groupBy() 和 .count() 在相​​对较小的 Dataframe 上运行缓慢

在 pyspark 中的简单 .first()、.count() 中出现错误,

带有 UDF 的 PySpark 数据框