Хорошо, хорошо.
Если предположить, что приведенные выше числа не так хороши, поскольку это не кортеж (K, V), тогда предположим, что код выглядит следующим образом:
data = sc.parallelize( [(0, 2.), (0, 4.), (1, 0.), (1, 10.), (1, 20.)] )
sumCount = data.combineByKey(lambda value: (value, 1),
lambda x, value: (x[0] + value, x[1] + 1),
lambda x, y: (x[0] + y[0], x[1] + y[1]))
averageByKey = sumCount.map(lambda (label, (value_sum, count)): (label, value_sum / count))
print averageByKey.collectAsMap()
В Spark с python2 (pyspark) вышеуказанный код работает нормально.
В Spark с python3 (pyspark) приведенный выше код выдает ошибку:
averageByKey = sumCount.map(lambda (label, (value_sum, count)): (label, value_sum / count))
https://www.python.org/dev/peps/pep-3113/ объясняет, почему эта функция, «распаковка параметров кортежа», была удалена в Python 3. Кажется, что-то вроде подвоха для меня.
Самый простой способ решить эту проблему - передать вышеизложенноевведите код онлайн в https://www.pythonconverter.com/ и запустите конвертер кодов. Это:
data = sc.parallelize( [(0, 2.), (0, 4.), (1, 0.), (1, 10.), (1, 20.)] )
sumCount = data.combineByKey(lambda value: (value, 1),
lambda x, value: (x[0] + value, x[1] + 1),
lambda x, y: (x[0] + y[0], x[1] + y[1]))
averageByKey = sumCount.map(lambda label_value_sum_count: (label_value_sum_count[0], label_value_sum_count[1][0] / label_value_sum_count[1][1]))
print(averageByKey.collectAsMap())
возвращает корректно:
{0: 3.0, 1: 10.0}
averageByKey теперь имеет другое объявление. Вы должны изучить и прочитать эту ссылку и познакомиться с ней, используя Конвертер Python 2 в 3. Экономит некоторое время, и вы можете облегчить свой путь в него. У уважаемого сотрудника SO также были некоторые проблемы с этим, так что у вас это есть, не так просто.