Spark groupByKey另类

时间:2015-06-24 14:30:07

标签: python apache-spark pyspark rdd reduce

根据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"]}

我觉得可能aggregateByKeyglom可以先在分区(map)中完成,然后将所有列表加在一起(reduce)。

1 个答案:

答案 0 :(得分:17)

groupByKey适合我们想要一个小小的"每个键的值集合,如问题所示。

TL; DR

"不要使用" groupByKey上的警告适用于两个一般情况:

1)您希望聚合这些值:

  • DON' T rdd.groupByKey().mapValues(_.sum)
  • DO rdd.reduceByKey(_ + _)

在这种情况下,groupByKey会浪费资源来实现集合,而我们想要的只是一个元素作为答案。

2)您希望通过低基数键对非常大的集合进行分组:

  • DON' T allFacebookUsersRDD.map(user => (user.likesCats, user)).groupByKey()
  • JUST DON' T

在这种情况下,groupByKey可能会导致OOM错误。

groupByKey在一个执行程序中实现具有相同键的所有值的集合。如上所述,它具有内存限制,因此,根据具体情况,其他选项更好。

所有分组功能,例如groupByKeyaggregateByKeyreduceByKey都依赖于基础:combineByKey,因此对于问题中的用例,没有其他选择会更好,他们都依赖于同一个共同的过程。