pyspark Window.partitionBy vs groupBy

时间:2017-11-08 08:20:19

标签: python apache-spark pyspark apache-spark-sql

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

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

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

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

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

1 个答案:

答案 0 :(得分:5)

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

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

此外,请参阅Yin Huai在此presentation中的幻灯片5,其中介绍了将DataFrame与Catalyst结合使用的好处。

总结一下,我认为在使用spark DataFrames时你很好地使用groupBy。根据您的要求,使用Window似乎不合适。