В документации Spark говорится, что метод RDD reduce
требует ассоциативной и коммутативной двоичной функции.Spark: разница семантики между сокращением и сокращениемByKey
Однако метод reduceByKey
ТОЛЬКО требует ассоциативной двоичной функции.
sc.textFile("file4kB", 4)
Я провел несколько тестов, и, по-видимому, это поведение, которое я получаю. Почему это различие? Почему reduceByKey
обеспечивает, чтобы бинарная функция всегда применялась в определенном порядке (для обеспечения отсутствия коммутативности), когда reduce
не работает?
Например, если нагрузка некоторых (маленький) текст с 4 разделов (минимум):
val r = sc.textFile("file4k", 4)
затем:
r.reduce(_ + _)
возвращает строку, в которой части не всегда в том же порядке, тогда как:
r.map(x => (1,x)).reduceByKey(_ + _).first
всегда возвращает ту же строку (где все находится в том же порядке, что и в оригинале l файл).
(я проверил с r.glom
, и содержимое файла действительно распространяется на 4 раздела, нет пустого раздела).
Я думаю, идея с 'reduceByKey' является то, что вы, вероятно, много разных ключей, поэтому вполне можно сократить все для одного ключа в одном потоке, что означает, что вы всегда можете запускать вычисления слева направо. Напротив, 'сокращение' часто будет использоваться в большом наборе данных, поэтому не нужно заботиться о порядке операций. –
Сколько исполнителей вы используете в своих экспериментах? – gprivitera