Pyspark python reduceByKey过滤器由math.max

问题描述 投票:1回答:1

我有一个关键日期和价值的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))

但我认为是错的。

我怎么能这样做?

谢谢

python apache-spark filter pyspark
1个回答
0
投票

您可以使用key参数使用python builtin max函数。 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))]
© www.soinside.com 2019 - 2024. All rights reserved.