【问题标题】:Create dataframe reading json file using json schema file outside the code使用代码外的 json 模式文件创建数据帧读取 json 文件
【发布时间】:2021-03-27 07:21:05
【问题描述】:

pyspark 中使用单独的 json 架构文件为 json 文件创建数据框的最佳方法是什么?。

示例 json 文件

{"ORIGIN_COUNTRY_NAME":"Romania","DEST_COUNTRY_NAME":"United States","count":1}
{"ORIGIN_COUNTRY_NAME":"Ireland","DEST_COUNTRY_NAME":"United States","count":264}
{"ORIGIN_COUNTRY_NAME":"India","DEST_COUNTRY_NAME":"United States","count":69}
{"ORIGIN_COUNTRY_NAME":"United States","DEST_COUNTRY_NAME":"Egypt","count":24}

读取此文件的代码

df_json = spark.read.format("json")\
    .option("mode", "FAILFAST")\
    .option("inferschema", "true")\
    .load("C:\\pyspark\\data\\2010-summary.json")

如果我不想使用“inferschema”选项而想使用 json 架构文件,请问我该怎么做?

json 架构文件

{"$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {"ORIGIN_COUNTRY_NAME": {"type": "string"},
                 "DEST_COUNTRY_NAME": {"type": "string"},
                 "count": {"type": "integer"}
                },
  "required": ["ORIGIN_COUNTRY_NAME","DEST_COUNTRY_NAME","count"]
}

【问题讨论】:

  • 您的问题可以做一些澄清。您是否能够编辑您已经发布的内容,请提供一个代码示例来说明您的意思。也许是直接将模式输入代码本身的示例。
  • 您可以解析您的架构文件并创建适当的StructType 架构,然后将其传递给您的spark.read 调用。这是 scala 的示例。但在 pyspark 中也应该这样做。 sparkbyexamples.com/spark/spark-read-json-with-schema
  • 我在发布之前看到了那个例子。在我的情况下,我想将架构保留在代码之外,原因是,如果将来有任何架构更改,我不想更改实际代码,我可以只更新架构文件。我想知道是否有办法做到这一点。

标签: json apache-spark pyspark apache-spark-sql pyspark-dataframes


【解决方案1】:

选项1:

我假设你的列都是可以为空的,

from spark.sql.types import StructType, StructField, StringType, IntegerType


yourSchema = StructType([ StructField("ORIGIN_COUNTRY_NAME", StringType(), True),
                          StructField("DEST_COUNTRY_NAME", StringType(), True),
                          StructField("count", IntegerType(), True),])

选项2:

像这样简单地读取你的文件..

df_json = spark.read.json("C:\\pyspark\\data\\2010-summary.json")
df_jsonSchema = df_json.schema

print(type(df_jsonSchema))
[each for each in zipsDFSchema]

根据结果,您可以像在选项 1 中一样构建您的架构。

【讨论】:

    猜你喜欢
    • 2022-09-27
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 2013-05-15
    • 2017-11-15
    • 1970-01-01
    相关资源
    最近更新 更多