ParallelCollectionRDD.reducebykey (_-_) не дает правильного результата - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь получить значение для функции lowerByKey ниже на RDD, однако это не дает правильный результат.

scala> val test =sc.parallelize(( (1 to 5).map(x=>("key",x)))).reduceByKey(_-_).collect
res62: Array[(String, Int)] = Array((key,-3))

Затем я попытался сделать следующий расчет

scala> List (1,2,3,4,5).reduce(_-_)
res65: Int = -13

Это происходит из-за того, что в операциях RDD нет гарантии порядка, и поэтому функция Reduce применяется в любом порядке, тогда как в случае порядка List гарантируется, так что функция Reduce работает правильно.

1 Ответ

0 голосов
/ 07 января 2019

Это не ошибка, а ожидаемое поведение. Если вы откроете документ для lowerByKey , вы можете увидеть (выделено мое):

Объедините значения для каждой клавиши, используя ассоциативную и коммутативную функцию уменьшения.

Эти два свойства необходимы для распараллеливания:

Вычитание не является ни ассоциативным, ни коммутативным. Таким образом, результат reduceByKey не определен.

На самом деле даже стандартная библиотека Scala GenTraversable.reduce говорит (снова мой акцент)

Сокращает элементы этой коллекции или итератора, используя указанный ассоциативный бинарный оператор.


Порядок , в котором выполняются операции с элементами , не определен и может быть недетерминированным .

Таким образом, утверждение ", тогда как в случае порядка List гарантируется, что функция Reduce ведет себя корректно " также ложно. Порядок в List является подробностями реализации и теоретически может быть изменен в любое время (хотя на практике это вряд ли произойдет из-за соображений производительности).

На случай, если вам интересно, как можно достичь -3, вот одно из возможных объяснений:

(-1 - -2 - -3) - (-4 - -5) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...