【发布时间】: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