我有如下json数据,其中version字段是区别点-
file_1 = {"version": 1, "stats": {"hits":20}} file_2 = {"version": 2, "stats": [{"hour":1,"hits":10},{"hour":2,"hits":12}]}
在新的格式中,stats列现在是 Arraytype(StructType)
.
以前只需要文件1,所以我使用
spark.read.schema(schema_def_v1).json(path)
现在我需要同时读取这两种类型的多个json文件。我不能在schema_def中将stats定义为字符串,因为这会影响 corruptrecord
特性(用于stats列),用于检查所有字段的格式错误的json和模式符合性。
示例1只读中需要df输出-
version | hour | hits
1 | null | 20
2 | 1 | 10
2 | 2 | 12
我试着和你一起读书 mergeSchema
选项,但这使stats字段成为字符串类型。
此外,我还尝试通过在version字段上过滤并应用 spark.read.schema(schema_def_v1).json(df_v1.toJSON)
. 这里stats列也变成 String
类型。
我在想,如果在阅读时,我可以将df列标题解析为 stats_v1
以及 stats_v2
基于数据类型可以解决这个问题。请帮助解决任何可能的问题。
3条答案
按热度按时间holgip5t1#
iiuc,您可以使用spark.read.text读取json文件,然后解析
value
使用json\u tuple,来自\u json。通知stats
我们使用的字段coalesce
基于两个或多个模式分析字段(添加wholetext=True
作为spark.read.text的参数(如果每个文件包含一个跨多行的json文档)h9vpoimq2#
UDF
要检查字符串或数组,如果是字符串,它会将字符串转换为数组。输出
无自定义项
jtw3ybtb3#
先读取第二个文件,分解
stats
,使用架构读取第一个文件。