我有一个像(id, (val1, val2))
这样的RDD。我想通过除以该特定ID的所有val2的总和来归一化每个ID的val2值。所以我的输出应该像(id, (val1, val2normalized))
有两种方法
groupByKey
,然后使用mapValues
将值归一化。reduceByKey
以获得与(id, val2sum)
一样的RDD,并将此RDD与原始RDD结合在一起以获得(id, ((val1, val2), val2sum))
,然后跟随mapValues
进行规范化。 应该选择哪个?
答案 0 :(得分:1)
如果您将自己限制为:
RDD
API。groupByKey
+ mapValues
与reduceByKey
+ join
前一个将是首选。由于RDD.join
是使用cogroup
实现的,因此后一种策略的成本只能高于groupByKey
(未缩减的cogroup
上的RDD
等效于{{ 1}},但您还需要groupByKey
的完整洗牌。请记住,如果人数过多,则两种解决方案都不可行。
但是,这可能不是最佳选择。根据每个组的大小和组的总数,可以使用broadcast join获得更好的性能。
与此同时,reduceByKey
API的随机播放内部结构得到了显着改善,并且可以自动应用某些优化,包括广播连接。