如何从嵌套的 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 表示法适用于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> 上工作。

因此,flattenitem.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 中读取字段?的主要内容,如果未能解决你的问题,请参考以下文章

Objective C如何从嵌套的JSON中读取

使用 spark 读取和访问 json 文件中的嵌套字段

如何从配置文件中读取嵌套对象的值

如何从 json 数据中读取特定字段? [关闭]

从嵌套的 Json 对象中读取值

如何仅显示嵌套 JSON 中的特定字段