运维开发网

如何在Spark(Python)中订购我的Row对象的字段

运维开发网 https://www.qedev.com 2020-04-26 14:54 出处:网络 作者:运维开发网整理
我在Spark中创建Row对象.我不希望我的字段按字母顺序排序.但是,如果我执行以下操作,则按字母顺序排序. row = Row(foo=1, bar=2) 然后它创建一个如下所示的对象: Row(bar=2, foo=1) 然后,当我在这个对象上创建一个数据帧时,列顺序将是第一个,第二个是foo,当我更喜欢使用它时. 我知道我可以使用“_1”和“_2”(分别用于“foo”和“bar”)然后分配一
我在Spark中创建Row对象.我不希望我的字段按字母顺序排序.但是,如果我执行以下操作,则按字母顺序排序.

row = Row(foo=1, bar=2)

然后它创建一个如下所示的对象:

Row(bar=2, foo=1)

然后,当我在这个对象上创建一个数据帧时,列顺序将是第一个,第二个是foo,当我更喜欢使用它时.

我知道我可以使用“_1”和“_2”(分别用于“foo”和“bar”)然后分配一个模式(具有适当的“foo”和“bar”名称).但有没有办法阻止Row对象排序?

But is there any way to prevent the Row object from ordering them?

没有. If you provide kwargs arguments will sorted by name.确定性行为需要排序,因为3.6之前的Python不保留关键字参数的顺序.

只需使用普通元组:

rdd = sc.parallelize([(1, 2)])

并将模式作为参数传递给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)])

最后,您可以通过选择对列进行排序

sc.parallelize([Row(foo=1, bar=2)]).toDF().select("foo", "bar")
0

精彩评论

暂无评论...
验证码 换一张
取 消