这是我的测试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字段,我必须更改什么?
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'])]
"""