我对 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 数据帧时,这些类型的操作通常运行得更快。
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]))
添加回答
举报
0/150
提交
取消