1. 程式人生 > >Hive/Shell 建立Hive 庫 ,表指令碼,Hive 動態增加分割槽指令碼

Hive/Shell 建立Hive 庫 ,表指令碼,Hive 動態增加分割槽指令碼

最近工作中使用到了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}';

留一篇備份,方便以後完成類似的功能~