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

结果:

数据被解析出来了,但是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

结果:

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

可以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

结果:

嗯,到这里需求结束啦。

### 解析包含嵌套数组JSON数据 在处理复杂的JSON结构时,特别是当这些结构中包含了嵌套数组的情况下,在Hive中的确存在一定的挑战。为了有效地解析这种类型的JSON文档提取所需的数据,可以利用`openx-jsonserde`工具来简化这一过程[^1]。 对于带有复杂结构如嵌套对象或数组JSON文件来说,不需要定义整个模式(schema),但是建议尽可能详尽地描述预期读取的部分。如果遇到不同版本间字段有所变化的情况——比如提到的第一版和第二版JSON文档之间的差异,则可以通过灵活配置SerDe参数适应这种情况下的变动而不必重新设计整体架构。 具体到操作层面,假设有一个存储于字符串列`json_column`内的JSON记录,其中含有名为`items`的数组属性: ```sql -- 创建临时函数以便使用OpenX JSON Serde ADD JAR /path/to/json-serde.jar; CREATE TEMPORARY FUNCTION json_tuple AS 'org.openx.data.jsonserde.JsonTuple'; -- 使用LATERAL VIEW explode() 来展开数组项 SELECT t.item['key_name'] as key_value FROM ( SELECT explode(json_tuple(cast(json_column AS string), 'items')) AS item FROM your_table ) t; ``` 上述SQL语句展示了如何通过创建临时函数引入外部库支持,进而调用特定方法完成对目标路径下JSON序列化数据的操作;接着借助`LATERAL VIEW explode()`实现将单个单元格内部多个按照一定规则拆分成多行显示的效果。 得注意的是,虽然这里展示的例子仅涉及到了一层深度的数组解析,但在实际应用当中可能还会碰到更深层次的对象嵌套情况。此时可以根据实际情况调整查询逻辑以满足需求。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值