python - Pyspark python reduceByKey 过滤器由 math.max
问题描述
我有一个 rdd,其中 Key 为 date , Value 为 . 就像是:
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))
但我认为它是错误的。
我怎么能做到呢?
谢谢
解决方案
您可以使用带有 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))]
推荐阅读
- matlab - 带低通滤波器的滤波功能
- lombok - 带有 Gradle 4.9 的 Lombok 注释处理器
- javascript - 如何重置全局变量
- python - Python:动态增长的 CSV
- javascript - 通过单击提交添加新元素
- java - Android Studio 3.1.3 中的错误
- php - DateTime 解析错误,找不到时区,以及舍入时间
- javascript - 除非我使用此解决方法,否则 Vue 变量不会呈现内存中存在的内容
- bash - Bash 输出下降?
- ms-access - MS Access Append Query 仅在 Wifi 连接时变慢