我对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]
来创建上面显示的输出。
谢谢。
答案 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数据帧时,这类操作通常运行得更快。