GroupByKey与Spark中的Join性能

时间:2018-11-21 20:35:36

标签: apache-spark rdd

我有一个像(id, (val1, val2))这样的RDD。我想通过除以该特定ID的所有val2的总和来归一化每个ID的val2值。所以我的输出应该像(id, (val1, val2normalized))

有两种方法

  1. 对id进行groupByKey,然后使用mapValues将值归一化。
  2. 执行reduceByKey以获得与(id, val2sum)一样的RDD,并将此RDD与原始RDD结合在一起以获得(id, ((val1, val2), val2sum)),然后跟随mapValues进行规范化。

应该选择哪个?

1 个答案:

答案 0 :(得分:1)

如果您将自己限制为:

  • RDD API。
  • groupByKey + mapValuesreduceByKey + join

前一个将是首选。由于RDD.join是使用cogroup实现的,因此后一种策略的成本只能高于groupByKey(未缩减的cogroup上的RDD等效于{{ 1}},但您还需要groupByKey的完整洗牌。请记住,如果人数过多,则两种解决方案都不可行。

但是,这可能不是最佳选择。根据每个组的大小和组的总数,可以使用broadcast join获得更好的性能。

与此同时,reduceByKey API的随机播放内部结构得到了显着改善,并且可以自动应用某些优化,包括广播连接。