1. 程式人生 > >hive加載json數據解決方案

hive加載json數據解決方案

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數據解決方案