You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的字典是无序结构,所以打印出来的顺序和排序后的列表顺序不一致。

两种解决方式:

  1. 兼容旧版本:导入collections.OrderedDict,用它来保存排序后的结果,确保顺序被保留:
    修改排序代码为:
    import collections
    delay = collections.OrderedDict(sorted(delay.items(), key=lambda x:x[1], reverse=True))
    
  2. 升级Python版本:将Linux环境的Python升级到3.7及以上,此时普通dict()会自动保留插入顺序,原代码无需修改即可正常工作。

内容的提问来源于stack exchange,提问作者Reungu Ju

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 22:48:19