火花组钥匙交替

2024-10-01 11:25:36 发布

您现在位置:Python中文网/ 问答频道 /正文

根据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)。在


Tags: to方法信息方式分布式thissparkkey2
1条回答
网友
1楼 · 发布于 2024-10-01 11:25:36

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

相关问题 更多 >