测试json  数据 格式 样例:


{"data":{"dt":"2018-12-13","hu":"17:17:17"},"web":{"web":"maitianzaixian.com.cn","whichfor":"computer"},"house":{"home":"yuanyangguoji","areo":400,"price":3400,"num":"10#102"}}


前期的 准备工作 :

需要根据hive的版本 去下载相关包:(放在 lib中)

json-serde-1.3.8-jar-with-dependencies.jar

有的版本 还需要 hive-hcatalog-core-2.0.1.jar (一般hive自带)


然后启动hive:


《第一种方式》:直接当成一个字段去处理:(这种方式不行的)

执行样例:

create external table if not exists json_01(
 json string
 )
 row format delimited 
 lines terminated by '\n'
 stored as textfile

结果:  虽然可以select * from json_01     但是   内部的 第二层结构就无法查看了  此方法不行



《第二种方式》:还是当成一个字段 只不过我需要用json 格式去解析:(一般较常用的方法)

create external table if not exists json_old(
 json string
 )
 row format serde 'org.apache.hadoop.hive.contrib.serde2.JsonSerde' 
 stored as textfile

有可能上面的引用包 不对,hive的版本过低缘故  那就换成 ‘org.openx.data.jsonserde.JsonSerDe’


查看 方式 也有两种:get_json_object   和  json_tuple


<get_json_object>方式


select * from json_01                 -----------------------整个json


 select get_json_object(js.json,'$.data'),get_json_object(js.json,'$.web') from json_01 js;


 select get_json_object(js.json,'$.data.dt'),get_json_object(js.json,'$.web.web') from json_01 js;    ----------嵌套


 select get_json_object(data.dl,'$.dt') from (select get_json_object(js.json,'$.data') as dl from json_01 js) data;
<json_tuple>方式

select json_tuple(json,"data") from json_01;  --------------MR


 select json_tuple(get_json_object(json,'$.data'),"dt","hu") from json_01 


 select js2.js2_data_dt,js3.js3_web_web,js4.js4_home from json_01 js lateral view json_tuple(js.json,'data','web','house')js1 as js1_data,js1_web,js1_house
 lateral view json_tuple(js1.js1_data,'dt','hu')js2 as js2_data_dt,js2_data_hu
 lateral view json_tuple(js1.js1_web,'web','whichfor')js3 as js3_web_web,js3_web_whichfor
 lateral view json_tuple(js1.js1_house,'home','areo','price','num')js4 as js4_home,js4_areo,js4_price,js4_num


《带有其他结构的 json格式》:

数据变种:

{"data":{"dt":"2018-12-13","hu":"17:17:17"},"web":{"web":"maitianzaixian.com.cn","whichfor":"computer"},"house":[{"home":"yuanyangguoji","areo":400,"price":3400,"num":"10#102"},{...........}]}   

   --------------------------------数据挖掘插件中 一些配置项  会带有   []


去掉中括号:

lateral view posexplode(split(regexp_replace(regexp_replace(js1.js1_house,'\\}\\,\\{','\\}\\|\\|\\{'),'\\[|\\]',''), '\\|\\|')) js11

 regexp_replace(js1.js1_house,'\\}\\,\\{','\\}\\|\\|\\{')    ===> (将 data  中的 “ },{”转成了 “}||{” )
 regexp_replace(regexp_replace(js1.js1_house,'\\}\\,\\{','\\}\\|\\|\\{'),'\\[|\\]','')   ===>  将 “[]” 变成 “”  空值
 split(regexp_replace(regexp_replace(js1.js1_house,'\\}\\,\\{','\\}\\|\\|\\{'),'\\[|\\]',''), '\\|\\|')   将 data 按 “||”切分


 json array 格式 转成了一个数组 再有posexplode 变成 (p,json)键值对


《第三种方式》:转换成map 结构    可以用到两种解析包:


create external table if not exists json(
 data map<string,string>,
 web map<string,string>,
 house map<string,string>
 )
 row format serde 'org.openx.data.jsonserde.JsonSerDe'
 stored as textfile








create external table if not exists json(
 data map<string,string>,
 web map<string,string>,
 house map<string,string>
 )
 row format serde 'org.apache.hive.hcatalog.data.JsonSerDe'
 stored as textfile


 select data['dt'] from json