Накопительное значение в цикле не применяется правильно - PullRequest
0 голосов
/ 05 ноября 2019

Я пытаюсь разделить значение между несколькими задачами с помощью аккумулятора, но значение аккумулятора, похоже, меняется при передаче на карту.

Я использую 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] и т.д ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...