|
大部分情况下,数据库都是可以通过运行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都写一个函数了。
附上相关文件如下:
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|