hive加載json數據解決方案
阿新 • • 發佈:2017-07-25
lena bash 文件 min blog ash eve 視圖 題解
hive官方並不支持json格式的數據加載,默認支持csv格式文件加載,如何在不依賴外部jar包的情況下實現json數據格式解析,本編博客著重介紹此問題解決方案
首先創建元數據表:
create EXTERNAL table access_log (content string) row format delimited fields terminated by ‘\t‘ STORED AS INPUTFORMAT ‘com.hadoop.mapred.DeprecatedLzoTextInputFormat‘ OUTPUTFORMAT ‘org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat‘ location ‘hdfs://sps1:9090/data/accesslog‘
創建視圖表:
create view access_log_view as select eventTime, ip, appName, fp, username, target from access_log lateral view json_tuple(content, "eventTime", "ip", "appName", "fp", "username", "target") t1 as eventTime, ip, appName, fp, username, target;
視圖表利用json tuple將json object的數據進行抽取,這樣就實現了字段分離。
但是有些日誌文件是/user/aaa/dt=2013-12-01/ds=01/access.log帶有分區目錄的,對於這種格式需要分區表的支持
創建分區表:
create EXTERNAL table access_log (content string) partitioned by (dt int, ds int) row format delimited fields terminated by ‘\t‘ STORED AS INPUTFORMAT ‘com.hadoop.mapred.DeprecatedLzoTextInputFormat‘ OUTPUTFORMAT ‘org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat‘ location ‘hdfs://sps1:9090/data/accesslog4‘;
但是問題來了,發現沒有辦法加載數據,該怎麽辦那。
下一步我們需要手動的加載分區:
alter table access_log add partition(dt=?,ds=?)
這樣就可以查到數據了。切記必須要進行分區add,否則無法查到數據。
創建視圖表:
與上邊創建視圖一樣
但是分區是隨著時間的推移進行增加的,這個不能人肉,我們需要自動化腳本來幫助我們完成
#!/bin/bash source ~/.bashrc date=`date +%Y-%m-%d` hour=`date +%H` cmd="ALTER TABLE databaseName.tableName ADD PARTITION(dt=‘$date‘, ht=‘$hour‘);" hive -e "$cmd"
至此為止,有關hive加載json數據和分區表的問題就解釋清楚了,不明白下方留言,我們繼續討論。
hive加載json數據解決方案