在大数据离线开发中,可能会遇到这样的情景:重刷从某天到某天的历史数据,比如重新跑从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