用于在 json 中爆炸的值列表的 Hive 查询

Posted

技术标签:

【中文标题】用于在 json 中爆炸的值列表的 Hive 查询【英文标题】:Hive query for exploding list of values in a json 【发布时间】:2020-12-17 21:59:34 【问题描述】:

Json


"Event": "StudentMarks",
"Marks Info": 
    "Marks": [
        "ID": 1,
        "Name": "Sub1",
        "Value": "95"
    , 
        "ID": 2,
        "Name": "Sub2",
        "Value": "96"
    , 
        "ID": 3,
        "Name": "Sub3",
        "Value": 100
    ]
  ,
"Grade": 
    "metric": "pass"
    

我正在尝试获取 Marks Info json 下的值,其中包含带有键 Marks 的 json 列表。我能够获得这些值,但我无法像单独的值一样将其拆分出来。

查询我使用

 select  Student_ID, get_json_object(get_json_object(json_blob,'$.Marks Info'), '$.Marks[*].Value') from my_table where my_condition;
         
  Student_ID    |get_json_object(get_json_object(json_blob, '$.Marks Info'), '$.Marks[*].Value')
       1        |                  ["95","96,100"]

所需输出

我希望列名应该是这样的 Sub1 Sub2 Sub2 Grade 并且值应该从列表中爆炸 ["95","96,100"]

有人可以帮我解决这个问题吗?

     Student_ID | Sub1  | Sub2|    Sub2 |    Grade    
        1       | "95"  | "96"|    100  |   "pass"

【问题讨论】:

【参考方案1】:

尝试以下查询。 get_json_object 返回一个字符串,所以你需要摆弄它才能得到你想要的。

select
    Student_ID,
    trim('[]"', x[0]) sub1,
    trim('[]"', x[1]) sub2,
    trim('[]"', x[2]) sub3,
    grade
from (
    select
        Student_ID,
        split(get_json_object(json_blob, '$.Marks Info.Marks[*].Value'), ',') x,
        get_json_object(json_blob, '$.Grade.metric') grade
    from my_table
)

【讨论】:

以上是关于用于在 json 中爆炸的值列表的 Hive 查询的主要内容,如果未能解决你的问题,请参考以下文章

规范化 Hive 中的横向爆炸

Hive 横向视图爆炸内部机制

来自 json-string 的蜂巢爆炸列表

Pyspark - 基于列表中的值爆炸数据框

hive UNION和子查询

Hive 查询执行时间过长