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

单个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    ...

 

你可能感兴趣的:(hive,阿里云)