【问题标题】:Hive: Extract Data From Nested JSON and AppendHive:从嵌套的 JSON 中提取数据并追加
【发布时间】:2019-10-27 08:37:16
【问题描述】:

我有一个带有 ID 和 JSON 的配置单元表,如下所示:

id   json
----------
21 | {"temp":"3","list":[{"url":"aaa.com"},{"url":"bbb.com"}]}
42 | {"temp":"2","list":[{"url":"qqq.com"},{"url":"vvv.com"}]}

想要的输出如下:

id   url
----------
21 | aaa.com
21 | bbb.com
42 | qqq.com
42 | vvv.com

有人能帮忙解决这个蜂巢查询吗?

直接应用explode() 不起作用,因为json 列是一个字符串。

【问题讨论】:

    标签: sql json hive hql cross-join


    【解决方案1】:

    试试下面的查询:

    hive> with cte as (
    select stack(2,int(21),string('{"temp":"3","list":[{"url":"aaa.com"},{"url":"bbb.com"}]}'),
    int(42),string('{"temp":"2","list":[{"url":"qqq.com"},{"url":"vvv.com"}]}')) as (id,json))  
    select id,url from (
    select id,
    split(
    regexp_replace(
            get_json_object(json,'$.list.url'),
      '(\\[|\\]|\")','')
     ,',')jsn from cte)t 
    lateral view explode(jsn)asd as url;
    

    输出:

    id      url
    21      aaa.com
    21      bbb.com
    42      qqq.com
    42      vvv.com
    

    功能说明:

    Stack --用于创建样本数据

    get_json_object -- 从 json 字符串中提取数据

    regexp_replace --替换[,],"字符

    split --split on , 这将返回数组

    explode --使用数组列爆炸

    【讨论】:

    • 谢谢你,太好了!
    【解决方案2】:

    您可以将get_json_object()explode() 方法一起用作

    select id,
           get_json_object(jst.js,'$.temp.url') as url
      from ( select explode(json) as js FROM json_tab ) jst
    

    【讨论】:

    • 我意识到json列是一个字符串。我收到一个错误explode() takes an array or a map as a parameter
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 2022-07-12
    • 2020-11-07
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    相关资源
    最近更新 更多