Office中国论坛/Access中国论坛
标题:
利用shell修改sql文件并运行。
[打印本页]
作者:
roych
时间:
2021-9-30 11:13
标题:
利用shell修改sql文件并运行。
大部分情况下,数据库都是可以通过运行sql文件来处理数据的。比如在MySQL界面上,就是用source xx.sql导入(运行)SQL文件。而hive同样也可以,语法是hive -f xxx.sql。
一旦要求获取最新月份的数据,是需要将月份作为变量传入的。一般来说,用shell传入变量也是可行的。麻烦的是,一些不定时更新的数据,比如,201909更新一次,202006更新一次,202102更新一次等等。
当然,我们也是可以用max(月份)写子查询关联处理。但是,——我又要说“但是”了。一旦数据量比较大,硬件不太好的话,跑数据就比较麻烦了。这也是前面写《
利用shell查询数据库最新分区
》的原因。
又由于hive不支持存储过程,所以,不能在SQL内部定义变量。这时候就需要转换下思维了。
先将占位符替换到需要更新的日期分区上,然后读取前面生成的最新分区,再把最新分区替换占位符,最后运行正确的SQL。
#
#调用: run_sql /home/dg_scb/yhya_kdts.sql
#################################
#修改后的SQL文件
sql_result_file=./sql_result.sql
#导出特殊分区日期的文件。格式为:分区,'库名.表名',由partition.sh生成,每月只跑一次。
partition_file=./partitions.csv
#本月以及前一天
receive_day=`date -d "-1 day" "+%Y%m%d"`
month_id=`date -d "-1 month" "+%Y%m"`
last_2_month=`date -d "-3 month" "+%Y%m"`
function run_sql(){
if [ $# = 1 ]; then
rm -rf $sql_result_file
cp $1 $sql_result_file
sed -i 's/@month_id/'$month_id'/g' $sql_result_file
sed -i 's/@receive_day/'$receive_day'/g' $sql_result_file
for line in `cat ${partition_file}`;
do
arr=(${line//,/ });
sed -i 's/'${arr[1]}'/'${arr[0]}'/g' $sql_result_file;
done;
hive -f $sql_result_file;
else
echo "[`date +'%Y%m%d %T'`] 脚本传参不正确,程序退出调度!"
exit
fi
}
复制代码
这里是一个函数。如果输入参数(if [ $# = 1 ])则删除旧(修改后的)文件,然后将文件复制一份。接着依次替换掉@receive_day和@month_id两个变量。最后读取分区csv文件,把对应的分区替换掉。
新建一个shell脚本,导入前面的sh文件(比如命名为run_hive.sh),然后调用run_sql函数,即可完成替换字符串并运行SQL的操作。
#!/bin/sh
#导入函数
source ./run_hive.sh
#调用函数
run_sql ./origin_hive.sql
复制代码
写函数的目的在于方便多次调用。比如,你有多个SQL文件需要处理,就不必每个shell都写一个函数了。
附上相关文件如下:
[attach]64169[/attach][attach]64168[/attach][attach]64167[/attach]
欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/)
Powered by Discuz! X3.3