Hadoop生態(tài)的數(shù)據(jù)處理引擎Hive,內(nèi)置支持處理結(jié)構(gòu)化的數(shù)據(jù)存儲格式,如CSV、TSV、AVRO、PARQUET等。但是對于非結(jié)構(gòu)化的JSON格式數(shù)據(jù)處理則較為棘手,需要自己實(shí)現(xiàn)UDF函數(shù)或使用其他外部庫。
--例子1:自定義UDF函數(shù)解析JSON數(shù)據(jù),查詢Hive中的JSON數(shù)據(jù) CREATE TEMPORARY FUNCTION parse_json AS 'com.example.udf.ParseJsonUDF'; SELECT parse_json(json_field) FROM json_table;
自定義UDF函數(shù)需實(shí)現(xiàn)org.apache.hadoop.hive.ql.exec.UDF接口或其子類,并重寫evaluate()方法。代碼如下:
public class ParseJsonUDF extends UDF { public String evaluate(String json) throws JSONException { JSONObject jsonObject = new JSONObject(json); return jsonObject.getString("field_name"); } }
使用外部庫解析JSON格式數(shù)據(jù),常用的庫有JsonSerde和Hive-JSON-Serde。以JsonSerde為例:
--例子2:JsonSerde庫解析JSON數(shù)據(jù),查詢Hive中的JSON數(shù)據(jù) ADD JAR /path/to/json-serde-1.3.9.jar; --添加JsonSerde庫 CREATE EXTERNAL TABLE json_table (json_field STRING) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' STORED AS TEXTFILE; SELECT json_field->>'$.field_name' FROM json_table;
使用JsonSerde庫需先下載jar包,并使用ADD JAR命令添加到Hive中。創(chuàng)建表時需要指定JsonSerDe序列化器,再使用json_field->>'$.field_name'語法查詢JSON字段。
上一篇docker主要用在哪