根据Databricks的最佳实践,应该避免Spark groupByKey
,因为Spark groupByKey
处理的工作方式是首先将信息拖过工作人员,然后进行处理。 Explanation
所以,我的问题是,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
)。
答案 0 :(得分:17)
groupByKey
适合我们想要一个小小的"每个键的值集合,如问题所示。
"不要使用" groupByKey
上的警告适用于两个一般情况:
1)您希望聚合这些值:
rdd.groupByKey().mapValues(_.sum)
rdd.reduceByKey(_ + _)
在这种情况下,groupByKey
会浪费资源来实现集合,而我们想要的只是一个元素作为答案。
2)您希望通过低基数键对非常大的集合进行分组:
allFacebookUsersRDD.map(user => (user.likesCats, user)).groupByKey()
在这种情况下,groupByKey
可能会导致OOM错误。
groupByKey
在一个执行程序中实现具有相同键的所有值的集合。如上所述,它具有内存限制,因此,根据具体情况,其他选项更好。
所有分组功能,例如groupByKey
,aggregateByKey
和reduceByKey
都依赖于基础:combineByKey
,因此对于问题中的用例,没有其他选择会更好,他们都依赖于同一个共同的过程。