Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在执行器上动态创建累加器_Scala_Apache Spark_Rdd - Fatal编程技术网

Scala 在执行器上动态创建累加器

Scala 在执行器上动态创建累加器,scala,apache-spark,rdd,Scala,Apache Spark,Rdd,我想使用累加器来计算RDD中对象的几个参数的组合。 例如,我有Obj的RDD,带有a和b字段。这两个字段都是枚举,可能有几个值中的一个。 为了实现这一点,我应该在驱动程序上创建累加器,并在工人身上使用: val acc1 = sc.longAccumulator("a1-b1") val acc2 = sc.longAccumulator("a2-b1") val acc3 = sc.longAccumulator("a1-b2") .

我想使用累加器来计算RDD中对象的几个参数的组合。 例如,我有
Obj
的RDD,带有
a
b
字段。这两个字段都是枚举,可能有几个值中的一个。 为了实现这一点,我应该在驱动程序上创建累加器,并在工人身上使用:

val acc1 = sc.longAccumulator("a1-b1")
val acc2 = sc.longAccumulator("a2-b1")
val acc3 = sc.longAccumulator("a1-b2")
...
我不想为所有spark作业中的所有值组合声明大量计数器,因为我将使用相同的逻辑。 是否有任何机制允许在executor上动态创建累加器或以另一种方式解决此问题

我搜索类似的内容:

rdd.foreach{ getAccumulator("${obj.a} - ${obj.b}").add(1) }

从字面上回答您的问题,您不能在执行器上动态注册新的累加器。在作业实际开始之前,必须在驱动程序(
sparkContext.acculator()
)上计划蓄能器。这就是Spark中蓄能器的设计方式

但是考虑到您实际想要实现的功能,您可能会得出结论,通过只有一个“静态”累加器可以实现相同的功能,该累加器收集
Map
条目,而不是
Long

博客文章可能会让我更实际地理解这里的意思