火花 >= 3.0
在设置以下环境变量时,已使用SPARK-29748(删除 PySpark SQL 行创建导出中的字段排序)删除了字段排序,旧模式除外:
PYSPARK_ROW_FIELD_SORTING_ENABLED=true
火花 < 3.0
但是有什么方法可以防止 Row 对象对它们进行排序?
没有。如果您提供kwargs
参数将按名称排序。确定性行为需要排序,因为 3.6 之前的 Python 不保留关键字参数的顺序。
只需使用普通元组:
rdd = sc.parallelize([(1, 2)])
并将模式作为参数传递给RDD.toDF
(不要与 混淆DataFrame.toDF
):
rdd.toDF(["foo", "bar"])
或createDataFrame
:
from pyspark.sql.types import *
spark.createDataFrame(rdd, ["foo", "bar"])
# With full schema
schema = StructType([
StructField("foo", IntegerType(), False),
StructField("bar", IntegerType(), False)])
spark.createDataFrame(rdd, schema)
您还可以使用namedtuples
:
from collections import namedtuple
FooBar = namedtuple("FooBar", ["foo", "bar"])
spark.createDataFrame([FooBar(foo=1, bar=2)])
最后,您可以按以下方式对列进行排序select
:
sc.parallelize([Row(foo=1, bar=2)]).toDF().select("foo", "bar")