如何每日增量加載數據到Hive分區表


如何每日增量加載數據到Hive分區表


加載數據

數據加載到Hive分區表(兩個分區,日期(20160316)和小時(10))中
每日加載前一天的日志文件數據到表db_track.track_log

1. 數據存儲

數據日志文件,放入某個目錄下,每天日志文件放入同一個目錄
eg: 20160316 - 目錄名稱

日志文件數據,每個小時生成一個文件,一天總共有二十四個文件
eg: 2016031820

2. shell腳本編寫

負責調度的shell腳本load_tracklogs.sh
注:這里涉及到了兩個點:1)for循環 2) linux下字符串的截取${line:0:4} 3) 傳遞參數到hive的sql腳本

#!/bin/sh 
## 環境變量生效
. /etc/profile

## HIVE HOME
HIVE_HOME=/opt/cdh5.3.6/hive-0.13.1-cdh5.3.6

## 日志目錄
LOG_DIR=/data/tracklogs

## 目錄名稱, 依據日期date獲取
yesterday=`date -d -1days '+%Y%m%d'`

### 
for line in `ls $LOG_DIR/${yesterday}`
do
  echo "loading $line .............."
  #從文件名稱中解析出日期和小時
  daily=${line:0:4}${line:4:2}${line:6:2}
  hour=${line:8:2}
  LOAD_FILE=${LOG_DIR}/${yesterday}/${line}
  ### echo $daily + $hour
  ### ${HIVE_HOME}/bin/hive -e "LOAD DATA LOCAL INPATH '${LOAD_FILE}' OVERWRITE INTO TABLE db_track.track_log PARTITION(date = '${daily}', hour = '${hour}') ;"
  ${HIVE_HOME}/bin/hive --hiveconf LOAD_FILE_PARAM=${LOAD_FILE} --hiveconf daily_param=${daily} --hiveconf hour_param=${hour} -f /home/hadoop/load_data.sql
done


負責加載數據的sql腳本
注: 怎么在HQL腳本中獲取外接傳遞的參數

LOAD DATA LOCAL INPATH '${hiveconf:LOAD_FILE_PARAM}' OVERWRITE INTO TABLE db_track.track_log PARTITION(date = '${hiveconf:daily_param}', hour = '${hiveconf:hour_param}') ;

制定每天定時執行
可以在當前用戶下直接創建:crontab -e
注:crontab中的五個 *號分別代表分,時,日,月,周,下面的例子就是每天晚上1點30運行任務的例子,注意sh命令前一般需要加上絕對路徑

# LODAD DATA INTO TRACK_LOG
30 1 * * * /bin/sh /home/hadoop/load_tracklogs.sh


免責聲明!

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



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