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