Pyspark Python reduceByKey过滤器通过math.max

时间:2018-09-02 13:09:26

标签: python apache-spark filter pyspark

我有一个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 :(得分:0)

您可以使用带有key参数的python内置max函数。最大功能按键功能比较项目(在您的情况下为lambda 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))]