1.文件:table_config_order 内容如下
test.tb_test_basic work_date 1,2 3 2018-04-25
--- scheam.table 时间分区字段 每天都跑的处理方式 保留最近3天 数据时间分区存在起始时间
2.文件:delete_partitions.sh 内容如下
#!/bin/bash
#每天跑一次,和月末跑一次的程序可用crontab 定时计划执行
#检查分区是否存在
function check_partition(){
#table,dt
temp=`hive -e "show partitions $1"`
echo $temp|grep -wq "$2"
if [ $? -eq 0 ];then
echo "ok"
return 0
else
return 1
fi
}
##table dt 开始时间 结束时间
function date0(){
if [ $# == 4 ]; then
begin_date=`date -d "+0 day $3" +%Y-%m-%d`
end_date=`date -d "+0 day $4" +%Y-%m-%d`
date=${end_date}
sql=''
while [[ "${date}" > "${begin_date}" || "${date}" = "${begin_date}" ]]
do
sql=${sql}"ALTER TABLE $1 DROP IF EXISTS PARTITION($2 = '$date');"
date=`date -d "$date -1 days" +"%Y-%m-%d"`
done
echo "hive -e '${sql}' "
# hive -e "${sql}"
fi
}
#保留月末
function date_month()
{ #参数table dt 每月月末调一次
v_tm_f=`date +%Y%m01` #本月月初
# v_tm_l=`date -d "${v_tm_f} last day" +%Y%m%d` #本月月末
v_tm_l=`date +%Y%m%d`
v_curr=`date +%Y%m%d`
if [ "${v_curr}" = "${v_tm_l}" ];then
begin_date=$v_tm_f
end_date=$v_curr
date=${end_date}
sql=''
while [[ "${date}" > "${begin_date}" ]]
do
date=`date -d "$date -1 days" +"%Y%m%d"`
sql=${sql}"ALTER TABLE $1 DROP IF EXISTS PARTITION($2 = '$date');"
done
echo "hive -e '${sql}' "
#
hive -e "${sql}"
else
echo " not do anythings"
fi
}
#保留最近几天,第一次跑 开始跑一次
function date1()
{ #table dt 清理方式 days 起始分区时间
days=`expr $3 + 1`
v_curr=`date +%Y-%m-%d`
begin_date=$4
end_date=`date -d " - $days days" +"%Y-%m-%d"`
date=${end_date}
sql=''
while [[ "${date}" > "${begin_date}" || "${date}" = "${begin_date}" ]]
do
sql=${sql}"ALTER TABLE $1 DROP IF EXISTS PARTITION($2 = '$date');"
date=`date -d "$date -1 days" +"%Y-%m-%d"`
done
echo "hive -e '${sql}' "
# hive -e "${sql}"
}
#保留最近几天,第二次跑 每天都跑
function date2()
{ #table dt days
days=`expr $3 + 1`
date=`date -d" -$days days" +"%Y-%m-%d"`
sql=''
sql=${sql}"ALTER TABLE $1 DROP IF EXISTS PARTITION($2 = '$date');"
echo "hive -e '${sql}' "
# hive -e "${sql}"
}
function spilt()
{
OLD_IFS="$IFS"
IFS=","
arr=($1)
IFS="$OLD_IFS"
for s in ${arr[@]}
do
echo start------ date$s
date$s $var1 $var2 $var4 $var5
done
}
dir_base=`pwd`
filename=$dir_base/table_config_order
cat $filename | grep -v "^#" |grep -v "^$" |while read line
do
#从awk中传值到shell,利用中间目录取出每行的值,否则得到的是最后一行的数值
echo $line >$dir_base/tmp
eval $(awk '{printf(" var1=%s; var2=%s; var3=%s;var4=%s;var5=%s; ",$1,$2,$3,$4,$5)}' $dir_base/tmp)
spilt $var3
echo"-----------------------每月跑测试------------------"
date_month $var1 $var2
echo"-----------------------清除指定时间段分区------------------"
date0 table dt 2018-05-01 2018-05-10
#总结
#1.每天跑的第一天先执行date1一次,以后每天都是跑date2 ;
#2.按照月末跑的,只需要月末的时候crontab 调用一下date_month
#3.date0 可动态删除指定时间段的分区
done
将1,2两个文件放在同一级的目录下可,可直接测试运行
满足需求①保留最近N天的数据,每天都跑一次
②每到月末删除本月的分区数据,只保留月末一天
③删除指定时间段的分区