【发布时间】:2022-01-07 21:05:12
【问题描述】:
感谢您的帮助。使用 Pyspark(请不要使用 SQL)。所以我有一个存储为 RDD 对的元组列表:
[(('City1', '2020-03-27', 'X1'), 44),
(('City1', '2020-03-28', 'X1'), 44),
(('City3', '2020-03-28', 'X3'), 15),
(('City4', '2020-03-27', 'X4'), 5),
(('City4', '2020-03-26', 'X4'), 4),
(('City2', '2020-03-26', 'X2'), 14),
(('City2', '2020-03-25', 'X2'), 4),
(('City4', '2020-03-25', 'X4'), 1),
(('City1', '2020-03-29', 'X1'), 1),
(('City5', '2020-03-25', 'X5'), 15)]
以例如 ('City5', '2020-03-25', 'X5') 作为键,15 作为最后一对的值。
我想得到以下结果:
City1, X1, 2020-03-27, 44
City1, X1, 2020-03-28, 44
City5, X3, 2020-03-25, 15
City3, X3, 2020-03-28, 15
City2, X2, 2020-03-26, 14
City4, X4, 2020-03-27, 5
请注意结果显示:
-
每个城市的最大值的键(这是最难的部分,如果同一城市在不同日期具有相似的最大值(值),则显示两次,我假设不能使用 ReduceByKey() 作为键是不是唯一的,可能是 GroupBy() 或 Filter() ?
-
在以下排序/排序顺序中:
- 最大值递减
- 升序日期
- 降序城市名称(例如:City1)
所以我尝试了以下代码:
res = rdd2.map(lambda x: ((x[0][0],x[0][2]), (x[0][1], x[1])))
rdd3 = res.reduceByKey(lambda x1, x2: max(x1, x2, key=lambda x: x[1]))
rdd4 = rdd3.sortBy(lambda a: a[1][1], ascending=False)
rdd5 = rdd4.sortBy(lambda a: a[1][0])
虽然它确实给了我具有最大值的城市,但如果 2 个城市在 2 个不同的日期具有相似的最大值,它不会两次返回同一个城市(因为被键:城市减少)。
我希望它足够清楚,任何精度请询问! 非常感谢!
【问题讨论】:
标签: python apache-spark pyspark rdd