我想从我的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
做的事情,但我想知道,还有其他办法吗?
答案 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
以接受新类型。