json配列解析の2つの形式-hive
単一のjsonでgetを簡単に使えますjson_objectを解析するには,json配列を複雑な方法で解析する必要がある.
1、UDTFを使うことができて、これはアリクラウド環境の下で小さい仲間が書いたので、しかしこれはもとのデータと関連付けることができなくて、この1つのフィールドを取ることしかできません
2、複雑な関数で取り出し、reportは私のjson配列フィールドで、このように救い出して他のフィールドと接続して一緒に取り出すことができます
注意:where条件はLATERAL VIEWに書いてから、[エスケープで置換する]
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 ...