Spark aggregateByKey:使用密钥

时间:2017-12-07 14:56:11

标签: apache-spark

我想从我的RDD创建一组bloom过滤器。我这样做的方式如下:

rdd.aggregateByKey(create(size))(add, combine).collect()

其中rdd类似于RDD[(Int, Long)]

问题是这些值不是在每个组内均匀分布的。也就是说,"一个size适合所有"我不在这里工作,我想为每个键初始化布隆过滤器,具体取决于有多少元素。

所以我想要像

这样的东西
rdd.aggregateByKey(key => create(count(key))(add, combine).collect()

count是带有计数的地图。

这是我可以用groupByKey做的事情,但我想知道,还有其他办法吗?

1 个答案:

答案 0 :(得分:2)

你可以使用一个简单的技巧。将forall(pattern(X, Y), cond1(Assoc0, X, Assoc1)) RDD转换为(key, value)

(key, (key, value))

并申请val kkvRdd = rdd.map { case (key, value) => (key, (key, value)) }

combineByKey

调整def createCombiner(v: (Int, Long)) = create(count(_._1)) // And insert _._2 kkvRdd.combineByKey(createCombiner, add, combine) add以接受新类型。