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