hive (2.01)读取 json 格式 的处理方式 2018-4-24

7 篇文章 0 订阅
2 篇文章 0 订阅

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值