场景:
有一批平行的数据库db1, db2, db3, ...,每个库有同样命名的一批视图tb1; tb2; ...,这些视图展示的是最新跑批结果的数据,基于这些视图下游有一些应用。
现:要将这批视图转成分区物理表,再基于该分区物理表的最新跑批结果,即最新分区做下游应用。
要求是:每张表切换新跑批脚本的的时候,下游应用无感
方案:
将tb1; tb2; ...视图脚本改为物理表脚本,改好了的跑对接物理表最新分区的下游新应用;没改好的跑原来的下游应用。
2.针对每个db的每张tb, 切换其下游应用脚本为:
#!/bin/bash #所需参数--库名;表名 #${DB_NAME} --库名 #${TB_NAME} --表名
#${EXEC_DATE} --跑批执行时间 PARTITION_COL='prt_dt' #分区字段名--prt_dt PARTITION_VAL=${EXEC_DATE} #当前跑批分区日期 STD_DB_NAME=$(echo ${DB_NAME} | tr '[A-Z]' '[a-z]') #统一转小写 STD_TB_NAME=$(echo ${TB_NAME} | tr '[A-Z]' '[a-z]') hdfs_save_path=`hdfs dfs -ls -t hdfs://hadoop01/user/hive/warehouse/$STD_DB_NAME.db/$STD_TB_NAME` #若已切换为物理表,则在hdfs可以查到存储的表目录下的分区文件夹 echo $hdfs_save_path
partition_table_flg=$(echo $hdfs_save_path | grep "prt_dt") echo "partition_table_flg:$partition_table_flg" 若有分区文件夹,可以grep出含有分区字段prt_dt的文件夹名称 if [[ "$partition_table_flg !="" ]] then echo "You are using new version, ${PARTITION_COL} = ${PARTITION_VAL}." `--若为已切换分区表,基于最新分区(当前跑批分区)的下游应用` else echo "You are using old version, date= ${PARTITION_VAL}." `--若未获取到分区的信息,任然取旧的应用方式` fi