【发布时间】:2019-10-13 19:09:22
【问题描述】:
我在 json 文件中为 df 定义了我的架构,如下所示:
{
"table1":{
"fields":[
{"metadata":{}, "name":"first_name", "type":"string", "nullable":false},
{"metadata":{}, "name":"last_name", "type":"string", "nullable":false},
{"metadata":{}, "name":"subjects", "type":"array","items":{"type":["string", "string"]}, "nullable":false},
{"metadata":{}, "name":"marks", "type":"array","items":{"type":["integer", "integer"]}, "nullable":false},
{"metadata":{}, "name":"dept", "type":"string", "nullable":false}
]
}
}
EG JSON 数据:
{
"table1": [
{
"first_name":"john",
"last_name":"doe",
"subjects":["maths","science"],
"marks":[90,67],
"dept":"abc"
},
{
"first_name":"dan",
"last_name":"steyn",
"subjects":["maths","science"],
"marks":[90,67],
"dept":"abc"
},
{
"first_name":"rose",
"last_name":"wayne",
"subjects":["maths","science"],
"marks":[90,67],
"dept":"abc"
},
{
"first_name":"nat",
"last_name":"lee",
"subjects":["maths","science"],
"marks":[90,67],
"dept":"abc"
},
{
"first_name":"jim",
"last_name":"lim",
"subjects":["maths","science"],
"marks":[90,67],
"dept":"abc"
}
]
}
我想从这个 json 文件创建等效的 spark 模式。下面是我的代码:(参考:Create spark dataframe schema from json schema representation)
with open(schemaFile) as s:
schema = json.load(s)["table1"]
source_schema = StructType.fromJson(schema)
如果我没有任何数组列,上面的代码可以正常工作。但是如果我的架构中有数组列,则会引发以下错误。
“无法解析数据类型:数组” ("无法解析数据类型:%s" json_value)
【问题讨论】:
-
你试过倒着做吗?您将模式创建为 Python 对象,包括数组,然后将其转换为 json,看看有什么区别。
-
提供的架构无效,
"items":{"type":["string", "string"]}后缺少逗号。我认为最好发布您的实际数据,或者只是尝试在 Spark 中加载 json,然后导出由 Spark 创建的架构 -
@AlexandrosBiratsis:架构已更新。我的实际数据是一个 csv 文件。我正在尝试将此模式包含在具有多个模式的 json 文件中,并且在读取 spark 中的 csv 文件时,我将参考此 json 文件以获取正确的模式以提供正确的列标题和数据类型。
-
是的,我看到了@blackfury,尽管您的架构再次无效!
"items":{"type":["string", "string"]}不是一个有效的定义,你到底想在这里说什么?你能发布一些实际的json数据吗? -
@AlexandrosBiratsis:添加了一个示例 json 数据
标签: json dataframe pyspark schema