hive加載json數據解決方案


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數據和分區表的問題就解釋清楚了,不明白下方留言,我們繼續討論。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM