json配列解析の2つの形式-hive

1633 ワード

単一のjsonでgetを簡単に使えますjson_objectを解析するには,json配列を複雑な方法で解析する必要がある.
1、UDTFを使うことができて、これはアリクラウド環境の下で小さい仲間が書いたので、しかしこれはもとのデータと関連付けることができなくて、この1つのフィールドを取ることしかできません
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    ...