首页 > 解决方案 > 用于在 json 中爆炸的值列表的 Hive 查询

问题描述

杰森

{
"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的 jsons 列表。我能够获得这些值,但我无法像单独的值一样将其拆分出来。

查询我使用

 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"

标签: apache-sparkhiveapache-spark-sql

解决方案


尝试以下查询。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
)

推荐阅读