根据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
因此,对于问题中的用例,没有其他选择会更好,它们都依赖于相同的共同过程。