批量清理hive的分区数据,从指定的文件获取相关的参数

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天的数据,每天都跑一次

              ②每到月末删除本月的分区数据,只保留月末一天

               ③删除指定时间段的分区



你可能感兴趣的:(hive)