Hive/Shell 建立Hive 庫 ,表指令碼,Hive 動態增加分割槽指令碼
阿新 • • 發佈:2018-12-22
最近工作中使用到了Hive, 並對Hive 的資料庫,表完成建立。
建立的表為分割槽表,也涉及到了分割槽表 的按天動態增加分割槽。
程式碼組織結構:
建立資料庫:
create_dmp.hql
-- dmp 資料庫儲存了dmp所需要的資料
CREATE DATABASE IF NOT EXISTS `dmp`
WITH DBPROPERTIES ( 'creator' = 'sunzhenhua', 'create_date' = '2018-06-07');
執行建立命令
hive -f create_dmp.hql
建立表:
create_clearlog.hql
-- dmp_clearlog 存放了清洗過後的投放資訊 -- 分割槽表: 按天分割槽 -- 外部表 USE dmp; CREATE EXTERNAL TABLE IF NOT EXISTS `dmp_clearlog` ( `date_log` string COMMENT 'date in file', `hour` int COMMENT 'hour', `device_id` string COMMENT '(android) md5 imei / (ios) origin mac', `imei_orgin` string COMMENT 'origin value of imei', `mac_orgin` string COMMENT 'origin value of mac', `mac_md5` string COMMENT 'mac after md5 encrypt', `android_id` string COMMENT 'androidid', `os` string COMMENT 'operating system', `ip` string COMMENT 'remote real ip', `app` string COMMENT 'appname' ) COMMENT 'cleared log of origin log' PARTITIONED BY ( `date` date COMMENT 'date used by partition' ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' TBLPROPERTIES ('creator'='szh', 'crate_time'='2018-06-07') ;
在編寫複雜建立表語句的時候著實遇到了很多問題,建立表的語句的書寫格式是要遵循規範的。
具體的規範定義,參考我的部落格:
這裡我們編寫了一個為 dmp.dmp_clearlog 動態增加分割槽的指令碼:
指令碼主要實現了以下幾種功能:
1.對傳入的日期引數進行校驗 ,1)可以建立指定日期的分割槽,2)日期引數必須為yyyy-MM-dd格式
2.向hive執行傳遞引數
3.使用hive 新版的cli 工具,beeline執行 hql 檔案 ,下面指令碼包含了兩種模式 hive-cli, beeline
延伸內容:
beeline 執行的詳細講解見我的另一篇部落格
shell 中對字串按指定分隔符進行劃分的三種方法
shell 中正則表示式的應用
日期判斷正則
date_pattern='^[0-9]{4}-((0([1-9]{1}))|(1[1|2]))-(([0-2]([0-9]{1}))|(3[0|1]))$'
下面是我的指令碼
load_hdfs_data_into_dmp_clearlog.sh
#! /bin/bash set -o errexit source /etc/profile source ~/.bashrc ROOT_PATH=$(dirname $(readlink -f $0)) echo $ROOT_PATH date_pattern_old='^[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}$' date_pattern='^[0-9]{4}-((0([1-9]{1}))|(1[1|2]))-(([0-2]([0-9]{1}))|(3[0|1]))$' #引數數量 argsnum=$# #一些預設值 curDate=`date +%Y%m%d` partitionDate=`date -d '-1 day' +%Y-%m-%d` fileLocDate=`date -d '-1 day' +%Y-%m-%d` #日誌存放位置 logdir=load_hdfs_data_logs function tips() { echo "Usage : load_data_into_dmp_clearlog.sh [date]" echo "Args :" echo "date" echo " date use this format yyyy-MM-dd , ex : 2018-06-02" echo "============================================================" echo "Example :" echo " example1 : sh load_data_into_dmp_clearlog.sh" echo " example2 : sh load_data_into_dmp_clearlog.sh 2018-06-02" } if [ $argsnum -eq 0 ] ; then echo "No argument, use default value" elif [ $argsnum -eq 1 ] ; then echo "One argument, check date pattern" arg1=$1 if ! [[ "$arg1" =~ $date_pattern ]] ; then echo -e "\033[31m Please specify valid date in format like 2018-06-02" echo -e "\033[0m" tips exit 1 fi #echo $arg1 |tr "-" " " dateArr=($(echo $arg1 |tr "-" " ")) echo "dateArr length is "${#dateArr[@]} partitionDate=${dateArr[0]}-${dateArr[1]}-${dateArr[2]} fileLocDate=${dateArr[0]}"-"${dateArr[1]}"-"${dateArr[2]} else echo -e "\033[31m Not valid num of arguments" echo -e "\033[0m" tips exit 1 fi if [ ! -d "$logdir" ]; then mkdir -p $logdir fi echo ${partitionDate} cd $ROOT_PATH #nohup hive -hivevar p_date=${partitionDate} -hivevar f_date=${fileLocDate} -f hdfs_add_partition_dmp_clearlog.hql >> $logdir/load_${curDate}.log nohup beeline -u jdbc:hive2://10.180.0.26:10000 -n cloudera-scm --color=true --silent=false --hivevar p_date=${partitionDate} --hivevar f_date=${fileLocDate} -f hdfs_add_partition_dmp_clearlog.hql >> $logdir/load_${curDate}.log
執行指令碼示例: (引數校驗)
最後動態增加分的指令碼
USE dmp;
ALTER TABLE `dmp_clearlog` ADD IF NOT EXISTS PARTITION (`date`='${hivevar:p_date}') LOCATION 'hdfs://dmp-big001.a1.bj.jd:8020/bigdata/clearedLog/Device/${hivevar:f_date}';
留一篇備份,方便以後完成類似的功能~