测试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