我有一个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))
但我认为这是错误的。
我该怎么做?
谢谢
答案 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))]