为了账号安全,请及时绑定邮箱和手机立即绑定

按 (K,V) 对减少并按 V 排序

按 (K,V) 对减少并按 V 排序

哔哔one 2021-09-02 21:00:03
我对 pyspark 和 RDD 非常陌生。如果这个问题非常简陋,请见谅。我已使用以下代码按数据进行映射和清理:delay = datasplit.map(lambda x: ((x[33], x[8], x[9]))).filter(lambda x: x[0]!= u'0.00').filter(lambda x: x[0]!= '')但现在我需要以某种方式转换为以下输出:(124, u'"OO""N908SW"')(432, u'"DL""N810NW"')其中第一个是x[33]由 x[8] 和 x[9] 组合分组时的上述总和我已完成映射并获得以下输出(接近)lines = delay.map(lambda x: (float(x[0]), [x[1], x[2]]))输出:[(-10.0, [u'OO', u'N908SW']),(62, [u'DL', u'N810NW]), (-6.0, [u'WN', w'N7811F'])]但我无法弄清楚如何减少或组合x[1]并x[2]创建上面显示的输出。提前致谢。
查看完整描述

2 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

作为一般经验法则,您需要尽可能少的 Python 操作。


我将您的代码简化为一map加一reduce。


import operator


delay_sum = datasplit\

    .map(lambda x: (x[8]+x[9], float(x[33]) if any(x[33]) else 0.0))\

    .reduceByKey(operator.add)

不用说,使用 spark 数据帧时,这些类型的操作通常运行得更快。


查看完整回答
反对 回复 2021-09-02
?
12345678_0001

TA贡献1802条经验 获得超5个赞

您可以在下面创建密钥reduceByKey,然后应用然后映射以获得统一密钥:


from operator import add

result = delay.map(lambda x: ((x[1], x[2]), x[0])) \

                  .reduceByKey(add).map(lambda x: (x[0][1] + x[0][2], x[1]))


查看完整回答
反对 回复 2021-09-02
  • 2 回答
  • 0 关注
  • 155 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信