如何从嵌套json中读取字段



这是我的测试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表示法适用于structarray<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'])]
"""

最新更新