根据Databricks的最佳实践,Spark groupByKey
应该避免,因为SparkgroupByKey
处理的工作方式是,信息将首先在工人之间进行洗牌,然后进行处理。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
或{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
在一个执行器中将同一个键的所有值具体化。如前所述,它有内存限制,因此,其他选项更好地取决于具体情况。在所有的分组函数,如^{} 、}都依赖于基:
aggregateByKey
和{combineByKey
,因此对于问题中的用例,没有其他更好的选择,它们都依赖于相同的公共过程。在相关问题 更多 >
编程相关推荐