如何从嵌套的 json 中读取字段?
Posted
技术标签:
【中文标题】如何从嵌套的 json 中读取字段?【英文标题】:How to read field from nested json? 【发布时间】:2021-12-31 12:03:23 【问题描述】:这是我的测试 json 文件。
"item" :
"fracData" : [ ],
"fractimeData" : [
"number" : "1232323232",
"timePeriods" : [
"validFrom" : "2021-08-03"
]
],
"Module" : [ ]
这就是我读取 json 文件的方式。
starhist_test_df = spark.read.json("/mapr/xxx/yyy/ttt/dev/rawdata/Test.json", multiLine=True)
starhist_test_df.createOrReplaceTempView("v_test_df")
此查询有效。
df_test_01 = spark.sql("""
select item.fractimeData.number from v_test_df""")
df_test_01.collect();
结果
[Row(number=['1232323232'])]
但是这个查询不起作用。
df_test_01 = spark.sql("""
select item.fractimeData.timePeriods.validFrom from v_test_df""")
df_test_01.collect();
错误
cannot resolve 'v_test_df.`item`.`fractimeData`.`timePeriods`['validFrom']' due to data type mismatch: argument 2 requires integral type, however, ''validFrom'' is of string type.; line 3 pos 0;
要读取 validFrom 字段,我需要更改哪些内容?
【问题讨论】:
【参考方案1】:用于访问值的dot
表示法适用于struct
或array<struct>
类型。
item.fractimeData
中字段number
的架构是string
,通过dot
表示法访问它会返回array<string>
,因为fractimeData
是一个数组。
同样,item.fractimeData
中字段 timePeriods
的架构是 <array<struct<validFrom>>
,通过 dot
表示法访问它会将其包装到另一个数组中,从而产生 array<array<struct<validFrom>>>
的最终架构。
您得到的错误是因为dot
表示法可以在array<struct>
上工作,但不能在array<array>
上工作。
因此,flatten
从item.fractimeData.timePeriods
返回一个array<struct<validFrom>>
的结果,然后应用dot
表示法。
df_test_01 = spark.sql("""
select flatten(item.fractimeData.timePeriods).validFrom as validFrom from v_test_df""")
df_test_01.collect()
"""
[Row(validFrom=['2021-08-03', '2021-08-03'])]
"""
【讨论】:
以上是关于如何从嵌套的 json 中读取字段?的主要内容,如果未能解决你的问题,请参考以下文章