Pyspark定制蓄电池

时间:2018-04-14 14:34:52

标签: apache-spark pyspark accumulator

我试图在pyspark中运行此程序作为自定义累加器的示例。我收到错误' int不可迭代'。我无法解决这个问题。有人可以帮我这个。

import findspark
findspark.init()
from pyspark import AccumulatorParam, SparkContext
sc = SparkContext('local','local')

rdd = sc.parallelize(xrange(10))

class SAP(AccumulatorParam):
    def zero(self, initialValue):
        s=set()
        s.add(initialValue)
        return s
    def addInPlace(self, v1, v2):

        return v1.union(v2)



ids_seen = sc.accumulator(0, SAP())
def inc(x):
    global ids_seen
    ids_seen += x
    return x

rdd.foreach(inc)

1 个答案:

答案 0 :(得分:2)

类型方面addInPlace(R, R) => Rzero(R) => R

初始值应与您在累加器中所期望的类型相同,因此您必须使用Accumulator初始化set

ids_seen = sc.accumulator(set(), SAP())

ids_seen = sc.accumulator({0}, SAP())

zero应为:

def zero(self, initialValue):
    return initialValue.copy()

最后inc应添加set

def inc(x):
    global ids_seen
    ids_seen += {x}
    return x