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,否則無法查到數據。
批量add分區方法:
#!/bin/bash source ~/.bashrc dir="/testdata/user" dt="dt=" ht="ht=" table="tpa.access_log" hscript="" #get date dir list for part in `hadoop fs -ls $dir |grep -o -P "[0-9-]+$"`; do #get hour dir list for part2 in `hadoop fs -ls $dir/$dt$part |grep -o -P "[0-9]+$"` do echo $dir/$dt$part/$ht$part2 tmp="ALTER TABLE $table ADD PARTITION($dt'$part', $ht'$part2');" hscript=$hscript$tmp done; done; hive -e "$hscript"
創建視圖表:
與上邊創建視圖一樣
但是分區是隨着時間的推移進行增加的,這個不能人肉,我們需要自動化腳本來幫助我們完成
#!/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數據和分區表的問題就解釋清楚了,不明白下方留言,我們繼續討論。