【问题标题】:How to not infer schema while creating dataframe from json?从json创建数据框时如何不推断架构?
【发布时间】:2018-05-26 14:35:00
【问题描述】:

我不想在从一组 json 创建数据帧时推断架构,但我不能像从 csv 读取时那样传递 inferSchema = 'false'。以下是我读取数据的方式:

df = spark.read.json(r's3://mypath/')

【问题讨论】:

    标签: python json apache-spark pyspark


    【解决方案1】:

    找了一会儿,在docs发现可以使用参数'primitivesAsString'

    df = spark.read.json(r's3://mypath/', primitivesAsString='true')
    

    这样我至少可以禁止对基本类型进行推理。但是,对于数组和结构,我不会避免它。不过,它对我有用。

    【讨论】:

      【解决方案2】:

      您可以自己创建模式,然后告诉 Spark 使用它,而不是推断模式。具有 3 列不同类型的小示例:

      schema = StructType([StructField('name', StringType(), True),
                           StructField('datetime', TimestampType(), True)
                           StructField('age', IntegerType(), True)])
      
      df = spark.read.schema(schema).json(r's3://mypath/')
      

      这只有在您事先知道 JSON 文件的结构时才有效。但是,如果有多个具有不同结构的文件,则可以通过读取相同的模式将它们合并在一起。没有某些列的文件将仅具有 null 值。

      【讨论】:

      • 这个问题是我不知道会发生什么,我的意思是,我不知道 json 中列的名称。
      • @Ifvv:是的,这仅在您知道要使用哪些列时才有效。如果 json 文件包含感兴趣的不同列,则可以在同一架构中指定所有列。对于那些缺少的列,该值将为空。
      猜你喜欢
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-01
      • 1970-01-01
      • 2016-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多