首页 文章

pyspark Window.partitionBy vs groupBy

提问于
浏览
7

假设我有一个大约21亿条记录的数据集 .

这是一个包含客户信息的数据集,我想知道他们做了多少次 . 所以我应该对ID进行分组并对一列进行求和(它有0和1值,其中1表示动作) .

现在,我可以使用一个简单的 groupByagg(sum) ,但据我了解,这并不是很有效 . groupBy 将在分区之间移动大量数据 .

或者,我也可以使用带有 partitionBy 子句的Window函数,然后对数据求和 . 其中一个缺点是我必须应用额外的过滤器,因为它会保留所有数据 . 我想要每个ID一个记录 .

但我没有看到这个窗口如何处理数据 . 它比这个组还要好吗和总和 . 还是一样吗?

1 回答

  • 4

    据我所知,在使用spark DataFrames时, groupBy 操作通过Catalyst优化 . DataFrame上的 groupBy 与RDD上的 groupBy 不同 .

    例如,DataFrame上的 groupBy 首先在分区上执行聚合,然后对最终聚合阶段的聚合结果进行混洗 . 因此,只有减少的聚合结果才会被洗牌,而不是整个数据 . 这类似于RDD上的 reduceByKeyaggregateByKey . 看到这个相关的SO-article有一个很好的例子 .

    另外,请参阅Yin Huai的这个presentation中的幻灯片5,其中介绍了将DataFrames与Catalyst结合使用的好处 .

    最后,我认为在使用spark DataFrames时你很好用 groupBy . 根据您的要求,使用 Window 似乎不合适 .

相关问题