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

时间:2018-12-01 19:36:09

标签: python pyspark rdd reduce

我对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 {8]和x [9]的组合分组时上述x[33]的总和

我已完成映射并获得以下输出(接近)

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 个答案:

答案 0 :(得分:2)

您可以在下面创建喜欢的密钥并应用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]))

答案 1 :(得分:0)

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

我将您的代码缩减为一个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)

{{1}}

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