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

我对 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]创建上面显示的输出。


提前致谢。


哔哔one
浏览 145回答 2
2回答

拉风的咖菲猫

作为一般经验法则,您需要尽可能少的 Python 操作。我将您的代码简化为一map加一reduce。import operatordelay_sum = datasplit\    .map(lambda x: (x[8]+x[9], float(x[33]) if any(x[33]) else 0.0))\    .reduceByKey(operator.add)不用说,使用 spark 数据帧时,这些类型的操作通常运行得更快。

12345678_0001

您可以在下面创建密钥reduceByKey,然后应用然后映射以获得统一密钥:from operator import addresult = delay.map(lambda x: ((x[1], x[2]), x[0])) \                  .reduceByKey(add).map(lambda x: (x[0][1] + x[0][2], x[1]))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python