根据 Databricks 最佳实践,应避免使用 Spark groupByKey
,因为 Spark groupByKey
处理的工作方式是,信息将首先在 worker 之间洗牌,然后再进行处理发生。 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
) 中完成,然后将所有列表连接在一起 ( 减少
)。
最佳答案
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
因此对于问题中的用例,没有其他选择会更好,它们都依赖相同的通用过程。
关于python - Spark groupByKey 替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31029395/