pyspark Window.partitionBy vs groupBy

Ant*_*der 9 python apache-spark apache-spark-sql pyspark

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

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

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

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

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

pan*_*sen 8

据我所知,在使用spark DataFrames时,groupBy操作通过Catalyst进行优化.在groupBy上DataFrames是不像groupBy上RDDS.

例如,groupByon DataFrames首先在分区上执行聚合,然后对最终聚合阶段的聚合结果进行混洗.因此,只有减少的聚合结果才会被洗牌,而不是整个数据.这与RDD 类似reduceByKeyaggregateByKey在RDD上类似.有一个很好的例子,请参阅这篇相关的SO文章.

此外,请参阅Yin Huai 在本演示文稿中的幻灯片5,其中介绍了将DataFrames与Catalyst结合使用的好处.

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