我试图解决这样一个问题:如果源表的所有类别在目标中都可用,那么就截断并加载目标表,否则什么都不做。
我还没有找到任何解决方案,只是使用配置单元和结束使用shell脚本以及解决这个问题。
是否可以避免shell脚本?
当前方法:
创建\u ind \u table.hql:
create temporary table temp.master_source_join
as select case when source.program_type_cd=master.program_type_cd then 1 else 0 end as IND
from source left join master
on source.program_type_cd=master.program_type_cd;
--if all the categoies from source persent in master then will contain 1 else 0'
drop table if exists temp.indicator;
create table temp.indicator
as select min(ind)*max(ind) as ind from master_source_join;
下面是我调用的脚本,如果主表中存在所有源表类别,则截断并加载主表。
tuncate\u load\u master.sh文件
beeline_cmd="beeline -u 'jdbc:hive2://abc.com:2181,abc1.com:2181,abc2.com:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2' --showHeader=flase --silent=true"
${beeline_cmd} -f create_ind_table.hql
## if indicator is 1 all the source category is present in master else not.
a=`${beeline_cmd} -e "select ind from temp.indicator;"`
temp=`echo $a | sed -e 's/-//g' | sed -e 's/+//g' | sed -e 's/|//g'`
echo $temp
if [ ${temp} -eq 1 ]
then
echo "truncate and load the traget table"
${beeline_cmd} -e "insert overwrite table temp.master select * from temp.source;"
else
echo "nothing to load"
fi
1条答案
按热度按时间6za6bjd01#
使用动态分区的查询将只覆盖源数据集中现有的分区。向表中添加一个虚拟分区,如下所示:https://stackoverflow.com/a/47505850/2700344
您可以使用解析表达式计算您的标志
min()
在同一子查询中,并按其筛选。对于返回的所有行,ind calculated将是相同的。而且似乎解析min()就足够了,不需要计算max()。按ind=1过滤。如果
min() over()
=0并且不会覆盖表。