json数组解析的两种形式-hive

本文介绍了解析JSON数组的两种方法:使用UDTF函数和复杂函数。UDTF适用于仅需解析特定字段的情况,而复杂函数允许与原始数据关联,适用于需要同时获取JSON数组和其他字段数据的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

        单个json我们很容易的可以用get_json_object进行解析,json数组就需要用复杂的方式了

1、可以用UDTF,这个是阿里云环境下小伙伴帮忙写的,但是这个不能和原数据进行关联,就是只能取这一个字段

import com.aliyun.odps.udf.UDFException;
import com.aliyun.odps.udf.UDTF;
import com.aliyun.odps.udf.annotation.Resolve;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;

/**
 * sql试例
 * parse_json_log(body) as()
 */
@Resolve("string->string")
public class ParseJsonArray extends UDTF {
    @Override
    public void process(Object[] objects) throws UDFException {
        String input = (String) objects[0];
        JsonParser parser = new JsonParser();
        JsonArray jsonArray = parser.parse(input).getAsJsonArray();
        for (int i = 0; i < jsonArray.size(); i++) {
            JsonElement jsonObj = jsonArray.get(i);
            forward(jsonObj.getAsJsonObject().toString());
        }
    }
}

2、用复杂的函数取出来,report是我的json数组字段,这样救能和别的字段连接起来一起取出来

注意:where条件要写到LATERAL VIEW之后,[   要通过转义符替换

select 
        identify_id
        ,get_json_object(concat('{',report_1,'}'),'$.reportId') as reportId
        ,get_json_object(concat('{',report_1,'}'),'$.title') as title
        ,get_json_object(concat('{',report_1,'}'),'$.isSelect') as isSelect
		,dt
from 	ods_trd_du_identify
LATERAL VIEW 
explode(split(regexp_replace(regexp_replace(report,'\\[\\{',''),'}]',''),'},\\{')) report as report_1
where    ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值