python - Spark2-submit 对 python 字典进行意外的自动排序

标签 python apache-spark-sql

使用“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 方式工作。

基于实际结果的疑问:

  1. 为什么会自动排序。 (根据我的理解,为了提高Spark端的性能,可能会应用这个逻辑。如果一旦忽略。)
  2. 如果排序一次,则不会使用“key”(如果排序一次,则 email 应位于顶部)
  3. 如果一旦明智地使用“值”,那么 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/

相关文章:

python - 使用 SymPy 消除变量以关联 Python 中的两个函数

python - 在 map 上绘制不同大小的圆圈

python - 在 Python 3 中绘制 3D 多边形

python - (Py)Spark中如何使用JDBC源读写数据?

scala - spark 数据框将行值转换为列名

python - 使用多行选项和编码选项读取 CSV

scala - 不支持的文字类型类 scala.runtime.BoxedUnit

python - 如何使用nopython true检查推断的numba类型?

apache-spark - Spark Sql 抛出 PermGen 空间错误

python - 使用分布式策略在 Colab TPU 上训练模型