按(K,V)对归约和按V排序

2024-06-25 05:44:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我是pyspark和RDDs的新手。如果这个问题很简单,我道歉。你知道吗

我已使用以下代码映射和清理数据:

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]来创建上面显示的输出。你知道吗

提前谢谢。你知道吗


Tags: 数据lambda代码mapfilterpysparkoodl
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]))

一般来说,您需要尽可能少的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数据帧时,这类操作通常运行得更快。你知道吗

相关问题 更多 >