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