【问题标题】:Columns order not preserved after reading spark Json file读取火花 Json 文件后未保留列顺序
【发布时间】:2021-07-21 08:42:33
【问题描述】:

我正在尝试使用 spark.read.json("<path>") 读取 json 文件,但默认情况下,列顺序会按 spark 排序。

有很多嵌套列/新列经常添加到架构中,我无法为所有列定义架构。

有什么方法可以让我们在 preserve column order 阅读 spark.read.json 的同时无需手动定义架构

Example:

json_str="""{"zip":"a","address":{"state":"la","pin":"1234","city":"go"},"street":"bar","building":"123"}"""

spark.read.json(sc.parallelize([json_str])).printSchema()
#root
# |-- address: struct (nullable = true)
# |    |-- city: string (nullable = true)
# |    |-- pin: string (nullable = true)
# |    |-- state: string (nullable = true)
# |-- building: string (nullable = true)
# |-- street: string (nullable = true)
# |-- zip: string (nullable = true)

如您所见,zip 在源 json 字符串中是 first key,但 Spark 将该列保持为 最后一个

我尝试使用schema_of_json,但仍然没有保留列顺序:

spark.sql("""select schema_of_json('{"zip":"a","address":{"state":"la","pin":"1234","city":"go"},"street":"bar","building":"123"}') as json_schema""").show(10,False)
#+----------------------------------------------------------------------------------------------------+
#|json_schema                                                                                         |
#+----------------------------------------------------------------------------------------------------+
#|struct<address:struct<city:string,pin:string,state:string>,building:string,street:string,zip:string>|
#+----------------------------------------------------------------------------------------------------+

请让我知道我们是否可以preserve订购without defining the schema manually

感谢您的帮助!

【问题讨论】:

  • 如果您没有将架构传递给spark.read.json,Spark 将从您的 JSON 文件中抽取样本并从中推断架构。您如何手动执行相同的操作以动态提取模式,然后使用它?

标签: python json scala apache-spark pyspark


【解决方案1】:

您可以使用 select 来定义顺序

df = spark.read.json(sc.parallelize([json_str]))
df.select("zip","address".....).show()

【讨论】:

  • 谢谢迈克尔,是的,我们可以做.select 但正如问题中提到的,我正在寻找保留顺序而不手动包含架构!
  • 啊,好的。我的猜测是可能有一种方法可以做你想做的事,但这不值得。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多