Pyspark 从 JSON 文件中获取 Schema
Posted
技术标签:
【中文标题】Pyspark 从 JSON 文件中获取 Schema【英文标题】:Pyspark get Schema from JSON file 【发布时间】:2018-07-05 07:12:27 【问题描述】:我正在尝试从 JSON 文件中获取 Pyspark
架构,但是当我使用 Python 代码中的变量创建架构时,我能够看到 <class 'pyspark.sql.types.StructType'>
的变量类型,但是当我试图获取通过 JSON 文件,它显示unicode
的类型。
有没有办法通过 JSON 文件获取pyspark
架构?
JSON 文件内容:
"tediasessionclose_schema" : "StructType([ StructField('@timestamp', StringType()), StructField('message' , StructType([ StructField('componentAddress', StringType()), StructField('values', StructType([ StructField('confNum', StringType()), StructField('day', IntegerType())])"
Pyspark 代码:
df = sc.read.json(hdfs_path, schema = jsonfile['tediasessionclose_schema'])
【问题讨论】:
tediasessionclose_schema = StructType([ StructField('@timestamp', StringType()), StructField('message' , StructType([StructField('componentAddress', StringType()) StructField('values', StructType([StructField('confNum', StringType())]))])),StructField('day', IntegerType())]) 是的@RameshMaharjan 我在json文件中有多行..但是为了测试我只放了一个。 是的@RameshMaharjan 【参考方案1】:config_json 文件:
"json_data_schema": ["contactId", "firstName", "lastName"]
PySpark 应用程序:
schema = StructType().add("contactId", StringType()).add("firstName", StringType()).add("lastName", StringType())
参考:https://www.python-course.eu/lambda.php
schema = StructType()
schema = map(lambda x: schema.add(x, StringType(), True), (data["json_data_schema"]))[0][0:]
希望此解决方案对您有用!
【讨论】:
【参考方案2】:您可以通过评估从读取 json 获得的字符串来获取架构:
import json
from pyspark.sql.types import StructField, StringType, IntegerType, StructType
with open('test.json') as f:
data = json.load(f)
df = sqlContext.createDataFrame([], schema = eval(data['tediasessionclose_schema']))
print(df.schema)
输出:
StructType(List(StructField(@timestamp,StringType,true),StructField(message,StructType(List(StructField(componentAddress,StringType,true),StructField(values,StructType(List(StructField(confNum,StringType,true),StructField(day,IntegerType,true))),true))),true)))
test.json
在哪里:
"tediasessionclose_schema" : "StructType([ StructField('@timestamp', StringType()), StructField('message' , StructType([ StructField('componentAddress', StringType()), StructField('values', StructType([ StructField('confNum', StringType()), StructField('day', IntegerType())]))]))])"
希望这会有所帮助!
【讨论】:
感谢@Florian,一般的想法是我已经在 json 配置文件中定义了模式,并在读取数据并尝试做同样的事情时从 json 配置文件传递模式..不适合我. @SumitGupta 不确定您想说什么?在上面的答案中,读取了一个带有架构的 json 文件,并传递了架构以创建一个 Dataframe。这也适用于从 hdfs 读取数据。为什么它不起作用,您遇到什么错误?不只是您的 json 架构格式错误吗? 谢谢@Florian,让我调试一下。 @SumitGupta 请注意,我在您的 json 文件内容中添加了一些括号以使其正常工作。 谢谢@Florian,我不明白为什么我们需要额外的 )]))])以上是关于Pyspark 从 JSON 文件中获取 Schema的主要内容,如果未能解决你的问题,请参考以下文章
Databricks 上的 PySpark 在绝对 URI 中获取相对路径:尝试使用 DateStamps 读取 Json 文件时
PySpark 从目录中读取多个 txt 文件为 json 格式