为什么createDataFrame对列重新排序?

Mic*_*ael 4 apache-spark apache-spark-sql pyspark

假设我从一个没有模式的列表创建一个数据框:

data = [Row(c=0, b=1, a=2), Row(c=10, b=11, a=12)]
df = spark.createDataFrame(data)
df.show()
Run Code Online (Sandbox Code Playgroud)
+---+---+---+
|  a|  b|  c|
+---+---+---+
|  2|  1|  0|
| 12| 11| 10|
+---+---+---+
Run Code Online (Sandbox Code Playgroud)

为什么列按字母顺序重新排序?
是否可以在不添加架构的情况下保留列的原始顺序?

use*_*411 5

为什么列按字母顺序重新排序?

因为Row创建**kwargs 的会按名称对参数进行排序

需要此设计选择来解决PEP 468中描述的问题。请检查SPARK-12467以进行讨论。

是否可以在不添加架构的情况下保留列的原始顺序?

不与**kwargs。您可以使用plain tuples

df = spark.createDataFrame([(0, 1, 2), (10, 11, 12)], ["c", "b", "a"])
Run Code Online (Sandbox Code Playgroud)

namedtuple

from collections import namedtuple

CBA = namedtuple("CBA", ["c", "b", "a"])
spark.createDataFrame([CBA(0, 1, 2), CBA(10, 11, 12)])
Run Code Online (Sandbox Code Playgroud)