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