Я пытаюсь разделить значение между несколькими задачами с помощью аккумулятора, но значение аккумулятора, похоже, меняется при передаче на карту.
Я использую pyspark и написал следующий очень простой код вчтобы выделить проблему, которая у меня была.
sc = spark.sparkContext
rdd = sc.parallelize([0,1,0,1,0])
for i in range(5):
rdd.foreach(lambda x: ma.add(x))
m = ma.value
print("m>", m)
rdd = rdd.map(lambda x: x + m)
print(rdd.collect())
ma = sc.accumulator(0.0)
Вывод, который я получаю:
m> 2.0
[2.0, 3.0, 2.0, 3.0, 2.0]
m> 12.0
[24.0, 25.0, 24.0, 25.0, 24.0]
m> 122.0
[366.0, 367.0, 366.0, 367.0, 366.0]
m> 1832.0
[7328.0, 7329.0, 7328.0, 7329.0, 7328.0]
m> 36642.0
[183210.0, 183211.0, 183210.0, 183211.0, 183210.0]
Я ожидал, что значение m, которое кажется правильным, будет добавлено к каждой записи, так чтовторой вывод будет
[14.0, 15.0, 14.0, 15.0, 14.0]
Вместо этого похоже, что на каждом этапе мы получаем добавление m * i к исходным данным [2*12, 1 + 2*12, 2*12, 1 + 2*12, 2*12]
и т.д ...