假设我有一个包含大约 21 亿条记录的数据集。
这是一个包含客户信息的数据集,我想知道他们做了多少次。所以我应该对 ID 进行分组并对一列求和(它有 0 和 1 值,其中 1 表示一个 Action )。
现在,我可以使用一个简单的 groupBy
和 agg(sum)
它,但据我所知,这并不是很有效。 groupBy
将在分区之间移动大量数据。
或者,我也可以使用带有 partitionBy
子句的 Window 函数,然后对数据求和。缺点之一是我必须应用额外的过滤器,因为它会保留所有数据。我想要每个 ID 一条记录。
但是我看不到这个窗口是如何处理数据的。是不是比这个 groupBy 和 sum.还是一样?
最佳答案
据我所知,在使用 spark DataFrames 时,groupBy
操作通过 Catalyst 进行了优化. DataFrames 上的 groupBy
与 RDD 上的 groupBy
不同。
例如,DataFrames 上的groupBy
首先对分区进行聚合,然后将聚合结果打乱以进行最后的聚合阶段。因此,只有减少的聚合结果会被打乱,而不是整个数据。这类似于 RDD 上的 reduceByKey
或 aggregateByKey
。看到这个相关SO-article有一个很好的例子。
此外,请参阅此 presentation 中的幻灯片 5 Yin Huai 介绍了将 DataFrames 与 Catalyst 结合使用的好处。
最后,我认为您在使用 spark DataFrames 时可以很好地使用 groupBy
。使用 Window
似乎不适合我的要求。
关于python - pyspark Window.partitionBy 与 groupBy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47174686/