2016-11-07 3 views
0

Я пытаюсь уменьшить RDD с 3 значениями, поэтому, во-первых, я карту ДРР следующего форматаУменьшить операцию на Спарк

a = mytable.rdd.map(lambda w: (w.id,(w.v1,w.v2,w.v3))) 

, а затем на следующем шаге я уменьшить его следующим код

b = a.reduceByKey(lambda a,b,c: (a[0] +','+ a[1],b[0] +','+ b[1],c[0] +','+ c[1])) 

Однако я получаю сообщение об ошибке, которое: TypeError:() занимает ровно 3 аргумента (2 приведены)

Моя цель состоит в том, чтобы добавить все значения этого РДУ, так, например, если мой рдд, имеющие следующие значения:

[(id1, ('a','b','c')),(id1', ('e','f','g'))] 

После снижения я хочу результаты быть в таком порядке:

[(id1, ('a,d','b,e','c,f'))] 

Благодаря

ответ

2

Оптимальное решение может быть выражено как:

a.groupByKey().mapValues(lambda vs: [",".join(v) for v in zip(*vs)]) 

где начальные groupByKey группирует данные в структуру, эквивалентную:

('id1', [('a','b','c'), ('e','f','g')]) 

zip(*vs) переставляет значения:

[('a', 'e'), ('b', 'f'), ('c', 'g')] 

и понимания с join сцепляются друг кортежей.

reduceByKey действительно не правильный выбор (подумайте о сложности) здесь, но в целом он принимает функцию двух аргументов, поэтому lambda a, b, c: ... не имеет значения. Я считаю, что вы хотели что-то вроде этого:

lambda a, b: (a[0] + "," + b[0], a[1] + "," + b[1], a[2] + "," + b[2]) 
Смежные вопросы