Python Lambda排序在不同设备结果异常,Apache Hive UDF问题求助
Hive UDF Python代码字典排序异常问题
我编写了一段Apache Hive UDF的Python代码,执行到print("previous:",delay)之前均正常,但排序字典后输出异常。本地VSCode中运行结果正常,但Linux环境下排序结果未按值降序排列,想确认是否是Linux环境的Python版本过旧导致的?
代码内容
#!/usr/bin/python import sys counter=0 delay={"carrier":0, "nas":0,"weather":0, "security":0, "late_aircraft":0} for line in sys.stdin: counter+=1 linet = line.strip() c,w,n,s,l = linet.split() c,w,n,s,l = float(c),float(w),float(n),float(s),float(l) delay["carrier"]+=c delay["nas"]+=n delay["weather"]+=w delay["security"]+=s delay["late_aircraft"]+=l for i in delay.keys(): delay[i]=delay[i]/counter # print(delay[i]) print("previous:",delay) delay=dict(sorted(delay.items(),key=lambda x:x[1],reverse=True)) print("after",delay) print("The delay category with the longest average delay is {0}; the average delay time is {1} minutes.".format(list(delay)[0],delay[list(delay)[0]]))
实际输出
('previous:', {'weather': 0.0, 'nas': 38.299999999999997, 'security': 0.0, 'carrier': 15.5, 'late_aircraft': 18.399999999999999}) ('after', {'late_aircraft': 18.399999999999999, 'nas': 38.299999999999997, 'security': 0.0, 'carrier': 15.5, 'weather': 0.0})
问题原因与解决办法
- 确实是Python版本差异导致的:Python 3.7及以后的版本才会保留字典的插入顺序,而你Linux环境中的Python版本大概率是3.6或更早(甚至是Python 2.x)。
- 你用
sorted()得到的是有序的键值对列表,但转成普通dict()后,旧版本Python的字典是无序结构,所以打印出来的顺序和排序后的列表顺序不一致。
两种解决方式:
- 兼容旧版本:导入
collections.OrderedDict,用它来保存排序后的结果,确保顺序被保留:
修改排序代码为:import collections delay = collections.OrderedDict(sorted(delay.items(), key=lambda x:x[1], reverse=True)) - 升级Python版本:将Linux环境的Python升级到3.7及以上,此时普通
dict()会自动保留插入顺序,原代码无需修改即可正常工作。
内容的提问来源于stack exchange,提问作者Reungu Ju
相关产品推荐
相关产品推荐

