【问题标题】:Create dataframe with schema provided as JSON file使用作为 JSON 文件提供的模式创建数据框
【发布时间】:2020-03-06 09:51:25
【问题描述】:

如何创建包含 2 个 JSON 文件的 pyspark 数据框?

  • file1:这个文件有完整的数据
  • file2:这个文件只有file1数据的schema。

文件1

{"RESIDENCY":"AUS","EFFDT":"01-01-1900","EFF_STATUS":"A","DESCR":"Australian Resident","DESCRSHORT":"Australian"}

文件2

[{"fields":[{"metadata":{},"name":"RESIDENCY","nullable":true,"type":"string"},{"metadata":{},"name":"EFFDT","nullable":true,"type":"string"},{"metadata":{},"name":"EFF_STATUS","nullable":true,"type":"string"},{"metadata":{},"name":"DESCR","nullable":true,"type":"string"},{"metadata":{},"name":"DESCRSHORT","nullable":true,"type":"string"}],"type":"struct"}]

【问题讨论】:

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


    【解决方案1】:

    您必须首先使用 Python json.load 读取架构文件,然后使用 StructType.fromJson 将其转换为 DataType

    import json
    from pyspark.sql.types import StructType
    
    with open("/path/to/file2.json") as f:
        json_schema = json.load(f)
    
    schema = StructType.fromJson(json_schema[0])
    

    现在只需将该架构传递给 DataFrame Reader:

    df = spark.read.schema(schema).json("/path/to/file1.json")
    
    df.show()
    
    #+---------+----------+----------+-------------------+----------+
    #|RESIDENCY|     EFFDT|EFF_STATUS|              DESCR|DESCRSHORT|
    #+---------+----------+----------+-------------------+----------+
    #|      AUS|01-01-1900|         A|Australian Resident|Australian|
    #+---------+----------+----------+-------------------+----------+
    

    编辑:

    如果包含架构的文件位于 GCS 中,您可以使用 Spark 或 Hadoop API 获取文件内容。以下是使用 Spark 的示例:

    file_content = spark.read.text("/path/to/file2.json").rdd.map(
        lambda r: " ".join([str(elt) for elt in r])
    ).reduce(
        lambda x, y: "\n".join([x, y])
    )
    
    json_schema = json.loads(file_content)
    

    【讨论】:

      【解决方案2】:

      我发现 GCSFS 包可以访问 GCP 存储桶中的文件:

      pip install gcsfs
      
      import gcsfs
      
      fs = gcsfs.GCSFileSystem(project='your GCP project name')
      
      with fs.open('path/toread/sample.json', 'rb') as f:
           json_schema=json.load(f)
      

      【讨论】:

        猜你喜欢
        • 2020-08-26
        • 1970-01-01
        • 2021-03-27
        • 1970-01-01
        • 2019-03-18
        • 2017-06-27
        • 2017-04-18
        • 2013-10-04
        相关资源
        最近更新 更多