使用作为 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 文件提供的模式创建数据框的主要内容,如果未能解决你的问题,请参考以下文章