Pyspark Python фильтр limitByKey по math.max - PullRequest
0 голосов
/ 02 сентября 2018

У меня есть rdd с ключом в качестве даты и значением как. что-то вроде:

2017-07-03 00:00:00 (u'LANXESS', 17119)
2017-07-03 00:00:00 (u'SCHALTBAU', 225)
2018-05-08 00:00:00 (u'LINDE', 8105)
2018-05-08 00:00:00 (u'HSBC', 16084)

Я хочу использовать rdd.reduceByKey и хочу выбрать максимум "somenumber".

так что для образца ввода я ожидаю увидеть:

2017-07-03 00:00:00 (u'LANXESS', 17119)
2018-05-08 00:00:00 (u'HSBC', 16084)

, который фактически является датой, является моим ключом, и значения фильтруются.

Я пытаюсь сделать что-то вроде:

test4 = test3.reduceByKey(lambda a,b: math.max(a_2))

но я предполагаю, что это неправильно.

Как бы я мог это сделать?

Спасибо

1 Ответ

0 голосов
/ 03 сентября 2018

Вы можете использовать встроенную в Python функцию max с ключевым аргументом. Функция Max сравнивает элементы по ключевой функции (лямбда x: x [1] или itemgetter (1) в вашем случае).

rdd = sc.parallelize([
    ('2017-07-03 00:00:00', (u'LANXESS', 17119)),
    ('2017-07-03 00:00:00', (u'SCHALTBAU', 225)),
    ('2018-05-08 00:00:00', (u'LINDE', 8105)),
    ('2018-05-08 00:00:00', (u'HSBC', 16084)),
]).reduceByKey(lambda x,y: max((x, y), key=lambda x: x[1]))
rdd.collect()

или более функциональным способом

from operator import itemgetter
from functools import partial

reduce_func = partial(max, key=itemgetter(1))
rdd = sc.parallelize([
    ('2017-07-03 00:00:00', (u'LANXESS', 17119)),
    ('2017-07-03 00:00:00', (u'SCHALTBAU', 225)),
    ('2018-05-08 00:00:00', (u'LINDE', 8105)),
    ('2018-05-08 00:00:00', (u'HSBC', 16084)),
]).reduceByKey(reduce_func)
rdd.collect()

Результаты:

[('2018-05-08 00:00:00', ('HSBC', 16084)),
 ('2017-07-03 00:00:00', ('LANXESS', 17119))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...