设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 2299|回复: 0
打印 上一主题 下一主题

利用shell修改sql文件并运行。

[复制链接]
跳转到指定楼层
1#
发表于 2021-9-30 11:13:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大部分情况下,数据库都是可以通过运行sql文件来处理数据的。比如在MySQL界面上,就是用source xx.sql导入(运行)SQL文件。而hive同样也可以,语法是hive -f xxx.sql。
一旦要求获取最新月份的数据,是需要将月份作为变量传入的。一般来说,用shell传入变量也是可行的。麻烦的是,一些不定时更新的数据,比如,201909更新一次,202006更新一次,202102更新一次等等。
当然,我们也是可以用max(月份)写子查询关联处理。但是,——我又要说“但是”了。一旦数据量比较大,硬件不太好的话,跑数据就比较麻烦了。这也是前面写《利用shell查询数据库最新分区》的原因。
又由于hive不支持存储过程,所以,不能在SQL内部定义变量。这时候就需要转换下思维了。
先将占位符替换到需要更新的日期分区上,然后读取前面生成的最新分区,再把最新分区替换占位符,最后运行正确的SQL。
  1. #
  2. #调用: run_sql /home/dg_scb/yhya_kdts.sql
  3. #################################


  4. #修改后的SQL文件
  5. sql_result_file=./sql_result.sql
  6. #导出特殊分区日期的文件。格式为:分区,'库名.表名',由partition.sh生成,每月只跑一次。
  7. partition_file=./partitions.csv
  8. #本月以及前一天
  9. receive_day=`date -d "-1 day" "+%Y%m%d"`
  10. month_id=`date -d "-1 month" "+%Y%m"`
  11. last_2_month=`date -d "-3 month" "+%Y%m"`


  12. function run_sql(){
  13. if [ $# = 1 ]; then
  14. rm -rf $sql_result_file
  15. cp $1 $sql_result_file
  16. sed -i 's/@month_id/'$month_id'/g' $sql_result_file
  17. sed -i 's/@receive_day/'$receive_day'/g' $sql_result_file
  18. for line in `cat ${partition_file}`;
  19. do
  20. arr=(${line//,/ });
  21. sed -i 's/'${arr[1]}'/'${arr[0]}'/g' $sql_result_file;
  22. done;
  23. hive -f $sql_result_file;
  24. else
  25.   echo "[`date +'%Y%m%d %T'`] 脚本传参不正确,程序退出调度!"
  26.   exit
  27. fi
  28. }
复制代码
这里是一个函数。如果输入参数(if [ $# = 1 ])则删除旧(修改后的)文件,然后将文件复制一份。接着依次替换掉@receive_day和@month_id两个变量。最后读取分区csv文件,把对应的分区替换掉。

新建一个shell脚本,导入前面的sh文件(比如命名为run_hive.sh),然后调用run_sql函数,即可完成替换字符串并运行SQL的操作。
  1. #!/bin/sh
  2. #导入函数
  3. source ./run_hive.sh
  4. #调用函数
  5. run_sql ./origin_hive.sql
复制代码
写函数的目的在于方便多次调用。比如,你有多个SQL文件需要处理,就不必每个shell都写一个函数了。
附上相关文件如下:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-12-1 18:21 , Processed in 0.100958 second(s), 26 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表