我有一个用例,我想计算RDD中匹配某些过滤器的元素类型。
e.g。 RDD.filter(F1)和RDD.filter(!F1)
我有2个选项
LongAccumulator l1 = sparkContext.longAccumulator("Count1") LongAccumulator l2 = sparkContext.longAccumulator("Count2") RDD.forEachPartition(f -> { if(F1) l1.add(1) else l2.add(1) });
RDD.filter(F1).count(); RDD.filter(!F1).count()
第一种方法的一个好处是我们只需要迭代一次数据(因为我的数据集是TB的10s就很有用)
如果使用累加器可以实现相同的影响,那么计数的用途是什么?
答案 0 :(得分:2)
主要区别在于,如果您的代码在转换时失败,那么累加器将为updated而count()结果不会。
其他选项是使用纯map-reduce:
val counts = rdd.map(x => (F1(x), 1)).reduceByKey(_ + _).collectAsMap()
网络成本也应该很低,因为只会发送少量数字。它会创建一对(是F1(x)真/假,1),然后对所有这些进行求和 - 它将为您提供计数图中F1(x)和!F1(x)的项目数