2017-01-06 6 views
-1

Я новичок в Spark, и я все еще пытаюсь обвести вокруг некоторых своих концепций. Итак, у меня есть список кортежей с ключом, где оба ключа и значения также являются кортежами.Python Spark reduceByKey не применяется к отдельным элементам

val = [ 
    ((18, 13), (1, 1193, **5, 1**)), 
    ((18, 13), (1, 661, **3, 1**)), 
    ((9, 15), (1, 914, **3, 1**)) 
] 

В значениях кортежей меня интересуют последние два элемента (выделено полужирным шрифтом).

Я хочу выполнить следующее: 5 + 3 и 1 + 1, так как их кортежи имеют общий ключ (18,13), в то время как последний кортеж со значениями 3 и 1 должен оставаться неизменным. Для достижения этой цели, я следующее:

parsed_data = sc.parallelize(val) 
result = parsed_data.reduceByKey(lambda x,y: (x[2]+y[2], x[3]+y[3])) 

После применения этих reduceByKey, я получил следующие результаты:

[((18, 13), (8, 2)), ((9, 15), (1, 914, 3, 1))] 

Функция reduceByKey не была применена к последнему кортежу, поскольку оно не имеет пары для уменьшения. Теперь я пытаюсь понять, как я могу применить reducebyKey в любом случае, чтобы получить следующий вывод:

[((18, 13), (8, 2)), ((9, 15), (3, 1))] 

ответ

3

Самый простой здесь, вероятно, только для отображения значений заранее:

parsed_data.mapValues(lambda x: (x[2], x[3])).reduceByKey(lambda x,y: (x[0]+y[0], x[1]+y[1])) 

(Извиняюсь если синтаксис неправильный, я парень Scala, а не парень Python).