Spark累加器与计数

时间:2016-12-21 10:54:35

标签: apache-spark

我有一个用例,我想计算RDD中匹配某些过滤器的元素类型。

e.g。 RDD.filter(F1)和RDD.filter(!F1)

我有2个选项

  1. 使用累加器:例如
  2. LongAccumulator l1 = sparkContext.longAccumulator("Count1")
    LongAccumulator l2 = sparkContext.longAccumulator("Count2")
    RDD.forEachPartition(f -> {
        if(F1) l1.add(1)
        else l2.add(1)
    });
    
    1. 使用计数
    2.   

      RDD.filter(F1).count(); RDD.filter(!F1).count()

      第一种方法的一个好处是我们只需要迭代一次数据(因为我的数据集是TB的10s就很有用)

      如果使用累加器可以实现相同的影响,那么计数的用途是什么?

1 个答案:

答案 0 :(得分:2)

主要区别在于,如果您的代码在转换时失败,那么累加器将为updated而count()结果不会。

其他选项是使用纯map-reduce:

val counts = rdd.map(x => (F1(x), 1)).reduceByKey(_ + _).collectAsMap()

网络成本也应该很低,因为只会发送少量数字。它会创建一对(是F1(x)真/假,1),然后对所有这些进行求和 - 它将为您提供计数图中F1(x)和!F1(x)的项目数