shell获取指定开始结束时间内的所有日期及实战应用

在大数据离线开发中,可能会遇到这样的情景:重刷从某天到某天的历史数据,比如重新跑从20180101到20190228的历史数据,按天分区。接到这样的需求最笨的解决办法就是将hql语句每天手动跑一次,这样可想而知非常繁琐。第二中方法是编写脚本每月跑一次,脚本如下:

#!/bin/bash
#该脚本只能一个月的执行,输入的两个参数必须是月初、月末,格式为:yyyyMMdd

#输出脚本名称
echo 运行的脚本名称为: $(basename $0)

start_day=$1
end_day=$2

echo 执行的开始日期为:${start_day}
echo 执行的结束日期为:${end_day}

sql1=''

#判断参数是否大于等于两个
if [ $# -lt 2 ];then
  echo "[Usage] 请输入执行的开始时间和结束时间,输入的两个参数必须是月初、月末,格式为:yyyyMMdd!!!"
  exit $#
else
  ############ execute hive begin ##############
  for ((statis_day=${start_day};statis_day<=${end_day};statis_day++));
  do 
  #此方法SQL语句中不支持注释,跑之前把注释去掉
  sql=$(cat <<!EOF
  insert overwrite table day_partition_test partition (daystr = '$statis_day')
  select * from test.test where daystr = '$statis_day';
  
  !EOF)  
  echo $sql  
  echo ${statis_day}
  
  hive -e "$sql" 2> /home/fuyun/logs/test.log  
  done  
  ############ execute hive end   ##############
  
  exitCode=$?
  if [ $exitCode -ne 0 ];then
    echo "[ERROR] hive execute ${sql} is failed!!!"
    exit $exitCode
  else
    echo '${start_day}${end_day}的数据导入完成!!!'
  fi
  
fi

以上脚本有个缺点就是只能执行一个月的数据,因为在for循环中是按数字+1循环的,而日期跨月就不是+1了。

如果想通过脚本输入参数20180101和20190228就把所有数据按天导入指定表中,则可利用shell中日期函数进行优化,优化脚本如下:

#!bin/bash
#该脚本需要输入两个参数,开始时间和结束时间,格式为:yyyyMMdd
#输出脚本名称
echo 运行的脚本名称为: $(basename $0)

start_day=$1
end_day=$2
sql=''

echo 执行的开始日期为:${start_day}
echo 执行的结束日期为:${end_day}

#判断参数是否大于等于两个
if [ $# -lt 2 ];then
  echo "[Usage] 请输入执行的开始时间和结束时间,格式为:yyyyMMdd!!!"
  exit $#
else
  ############ execute hive begin ##############  
  while :
  do
    start_day=$(date -d "$start_day 1day"  +%Y%m%d)
    statis_day=`date -d "${start_day} -1 day" +%Y%m%d`
    
    #此方法SQL语句中不支持注释,跑之前把注释去掉
    sql=$(cat <<!EOF
    insert overwrite table day_partition_test partition (daystr = '$statis_day')
  select * from test.test where daystr = '$statis_day';
    
    !EOF)
    
    echo $sql
    echo ${statis_day}
    hive -e "$sql" 2>> /home/fuyun/logs/test.log
    
    if [ ${statis_day} -eq ${end_day} ]; then
      break;
    fi
  done  
  ############ execute hive end   ##############
  exitCode=$?
  if [ $exitCode -ne 0 ];then
    echo "[ERROR] hive execute ${sql} is failed!!!"
    exit $exitCode
  else
    echo '${start_day}${end_day}的数据导入完成!!!'
  fi

fi

猜你喜欢

转载自blog.csdn.net/lz6363/article/details/88776678