使用作为 JSON 文件提供的模式创建数据框

Posted

技术标签:

【中文标题】使用作为 JSON 文件提供的模式创建数据框【英文标题】:Create dataframe with schema provided as JSON file 【发布时间】: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"]

【问题讨论】:

【参考方案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)

【讨论】:

以上是关于使用作为 JSON 文件提供的模式创建数据框的主要内容,如果未能解决你的问题,请参考以下文章

使用 json 字符串值和模式创建 pyspark 数据框

从json模式构建spark模式

使用 json 模式更新 spark 数据框中的列

Spark - 使用 JSON 文件的许可模式将所有记录移动到损坏的列

json 文件模式/对象以触发模式以加载数据帧

使用 json 模式创建 bigquery 表的 Java 代码