使用“spark2-submit”时 Python dict 上出现意外的排序行为。
[tmp.py]
d = {
'name': 'stackoverflow',
'email': 'atack@xxx.com',
'zip': '628888',
}
print(d)
预期:
{
'name': 'stackoverflow',
'email': 'atack@xxx.com',
'zip': '628888',
}
实际:
> -bash-4.1$spark2-submit tmp.py
{'name': 'stackoverflow', 'zip': '628888', 'email': 'atack@xxx.com'}
19/08/08 09:33:35 INFO util.ShutdownHookManager: Shutdown hook called
19/08/08 09:33:35 INFO util.ShutdownHookManager: Deleting directory /tmp/spark-9bb6bd82-ba2c-4715-b27a-6fdc41d3297b
-bash-4.1$
我处于无法使用“python 或 python3 tmp.py”命令的情况。这是一个大故事。请忽略这一点。 Python 或 Python3 方式,它运行完美。我想让它通过 spark2-submit
方式工作。
基于实际结果的疑问:
- 为什么会自动排序。 (根据我的理解,为了提高Spark端的性能,可能会应用这个逻辑。如果一旦忽略。)
- 如果排序一次,则不会使用“key”(如果排序一次,则
email
应位于顶部) - 如果一旦明智地使用“值”,那么
628888
应该位于顶部。
想知道它以何种方式应用排序功能以及如何停止这种自动排序。我需要的顺序与我们作为输入给出的顺序相同。
谢谢
最佳答案
在 python 中,dict
键没有定义的排序顺序。您可以使用 OrderedDict 来维护键顺序: https://docs.python.org/2/library/collections.html#collections.OrderedDict
示例:
import collections
orderedDict = collections.OrderedDict()
orderedDict['name'] = 'stackoverflow'
orderedDict['email'] = 'atack@xxx.com'
orderedDict['zip'] = '628888'
print(orderedDict)
注意: 从 Python3.7+ 开始,字典实际上保留了它们的键插入顺序。 https://mail.python.org/pipermail/python-dev/2017-December/151283.html
关于python - Spark2-submit 对 python 字典进行意外的自动排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57415372/