Сокращение по (K, V) парам и сортировка по V - PullRequest
0 голосов
/ 01 декабря 2018

Я супер новичок в pyspark и RDD.Извиняюсь, если этот вопрос очень элементарный.

Я сопоставил и очистил данные, используя следующий код:

delay = datasplit.map(lambda x: ((x[33], x[8], x[9]))).filter(lambda x: x[0]!= u'0.00').filter(lambda x: x[0]!= '')

, но теперь мне нужно каким-то образом преобразовать в следующий вывод:

(124, u'"OO""N908SW"')
(432, u'"DL""N810NW"')

гдепервый - сумма x[33], упомянутая выше, когда она сгруппирована по комбинации x [8] и x [9]

Я завершил отображение и получил приведенный ниже вывод (который близок)

lines = delay.map(lambda x: (float(x[0]), [x[1], x[2]]))

Вывод:

[(-10.0, [u'OO', u'N908SW']),(62, [u'DL', u'N810NW]), (-6.0, [u'WN', w'N7811F'])]

, но я не могу понять, как уменьшить или объединить x[1] и x[2] для создания вывода, показанного выше.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Как правило, вам нужно как можно меньше операций с Python.

Я сократил ваш код до одной map и одной reduce.

import operator

delay_sum = datasplit\
    .map(lambda x: (x[8]+x[9], float(x[33]) if any(x[33]) else 0.0))\
    .reduceByKey(operator.add)

ИСамо собой разумеется, что такого рода операции обычно выполняются быстрее при использовании искровых данных.

0 голосов
/ 01 декабря 2018

Вы можете создать ключевые лайки ниже и применить reduceByKey, а затем сопоставить, чтобы получить унифицированный ключ:

from operator import add
result = delay.map(lambda x: ((x[1], x[2]), x[0])) \
                  .reduceByKey(add).map(lambda x: (x[0][1] + x[0][2], x[1]))
...