根据Databricks的最佳实践,Spark groupByKey 应该避免作为Spark groupByKey 处理工作的方式是首先将信息拖过工人,然后进行处理。 说明
所以,我的问题是,有什么替代方案 groupByKey 以某种方式,它将以分布式和快速的方式返回以下内容?
// want this
{"key1": "1", "key1": "2", "key1": "3", "key2": "55", "key2": "66"}
// to become this
{"key1": ["1","2","3"], "key2": ["55","66"]}
也许对我来说似乎 aggregateByKey 要么 glom 可以先在分区中做到(map)然后将所有列表连接在一起(reduce)。
groupByKey 如果我们想要每个键的“小”值集合,就像在问题中一样。
TL; DR
“不要使用”警告 groupByKey 适用于两个一般情况:
1)您希望聚合值:
- 别:
rdd.groupByKey().mapValues(_.sum)
- 做:
rdd.reduceByKey(_ + _)
在这种情况下, groupByKey 将浪费资源实现一个集合,而我们想要的只是一个元素作为答案。
2)您希望通过低基数键对非常大的集合进行分组:
- 别:
allFacebookUsersRDD.map(user => (user.likesCats, user)).groupByKey()
- 只是不要
在这种情况下, groupByKey 可能会导致OOM错误。
groupByKey 在一个执行程序中实现具有相同键的所有值的集合。如上所述,它具有内存限制,因此,根据具体情况,其他选项更好。
所有分组功能,如 groupByKey, aggregateByKey 和 reduceByKey 靠基地: combineByKey 因此,对于问题中的用例,没有其他选择会更好,它们都依赖于相同的共同过程。