hive解析key值包含数组的json

一般的json直接 get_json_object(column,'$.key') 可以直接取出对应字段

column:存储json的列

key:json中的key

代码事例:

    select
        company_id
        ,tag_manage
        ,get_json_object(tag_manage,'$.SERVICE_PROMISE')
    from XXX
    where 
          XXX

结果:hive解析key值包含数组的json_第1张图片

数据被解析出来了,但是key(SERVICE_PROMISE)里面存的是数组,而且get_object_json得到的结果是一个字符串。如何进一步解析?

方案一:可以将得到的字符串转化为数组,利用函数split(String,Separator),是将String根据Separator来分割成数据,在进行结下来的操作。(顺便记录下求数组长度的函数size(array))

方案二:直接获取数组中指定位置的值,get_json_object(column,'$.key[index]'),可直接得到数组中指定位置的某个值

方案二代码示例

select
    company_id
    ,tag_manage
    ,get_json_object(tag_manage,'$.SERVICE_PROMISE')
    ,get_json_object(tag_manage,'$.SERVICE_PROMISE[0]')
from XXX
where 
    XXX

结果:hive解析key值包含数组的json_第2张图片

上面只能获得数组中某个位置的值,如果想要的值并不确定在第几位,咋整?

可以json解析后拿到数组,这时候数结果其实是字符串,使用函数instr(String,target)判断字符串String是否包含子串target,如果包含则返回子串的位置,如果不存在返回0.

示例代码:

select
    company_id
    ,tag_manage
    ,get_json_object(tag_manage,'$.SERVICE_PROMISE')
    ,get_json_object(tag_manage,'$.SERVICE_PROMISE[0]')
    ,instr(get_json_object(tag_manage,'$.SERVICE_PROMISE'),'111')
from XXX
where 
    XXX

结果:

嗯,到这里需求结束啦。

你可能感兴趣的:(hive)