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
⑵ 在hive查詢中使用變數
Hive配置屬性存儲於 hiveconf 命名空間中,該命名空間中的屬性是可讀寫的。在查詢語句中插入 '${hiveconf:變數名}' ,就可以通過 hive -hiveconf來替換變數。例如,查詢語句和執行方式如下:
需要注意的是:
Hive命令行變數,存儲於 hivevar 命名空間中,該命名空間中的變數是可讀寫的。使用方式和hive配置屬性類似,只是在查詢語句中插入的是 '${hivecar:變數名}' ,其中命名空間"hivecar:"可以省略。例如:
因為命令行變數的命名空間是唯一可以省略的,因此:
其他替換變數的方法:
利用shell腳本設置hive查詢語句中的變數
利用Python替換Hive查詢語句中的變數
⑶ hive中 建索引可以添加if not exists 嗎我想在腳本中判斷索引表是否存在
如何創建索引 : 使用T-SQL語句創建索引的語法: CREATE [UNIQUE] [CLUSTERED|NONCLUSTERED] INDEX index_name ON table_name (column_name…) [WITH FILLFACTOR=x] UNIQUE表示唯一索引,可選 CLUSTERED、NONCLUSTERED表示聚集索引還是非聚集索引,可選 FILLFACTOR表示填充因子,指定一個0到依00之間的值,該值指示索引頁填滿的空間所佔的百分比 在stuMarks表的writtenExam列創建索引: USE stuDB GO IF EXISTS (SELECT name FROM sysindexes WHERE name = 'IX_writtenExam') DROP INDEX stuMarks.IX_writtenExam /*--筆試列創建非聚集索引:填充因子為三0%--*/ CREATE NONCLUSTERED INDEX IX_writtenExam ON stuMarks(writtenExam) WITH FILLFACTOR= 三0 GO /*-----指定按索引 IX_writtenExam 查詢----*/ SELECT * FROM stuMarks (INDEX=IX_writtenExam) WHERE writtenExam BETWEEN 陸0 AND 90 雖然我們可以指定SQL Server按哪個索引進行數據查詢,但一般不需要我們人工指定。SQL Server將會根據我們創建的索引,自動優化查詢