gpt4 book ai didi

hadoop - Hive:有条件地截断并加载表

转载 作者:可可西里 更新时间:2023-11-01 15:50:08 26 4
gpt4 key购买 nike

我正在尝试解决以下问题:如果源表的所有类别在目标中都可用,则截断并加载目标表,否则不执行任何操作。

我还没有找到任何仅使用 hive 的解决方案,最终也使用 Shell 脚本 来解决这个问题。

是否可以避免 shell 脚本?

当前方法:

create_ind_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;

下面是我调用的脚本,如果所有源表类别都存在于 master 中,则截断并加载 master 表。

tuncate_load_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

最佳答案

使用动态分区的查询将仅覆盖源数据集中存在的分区。向您的表添加一个虚拟分区,如以下答案:https://stackoverflow.com/a/47505850/2700344

您可以在同一个子查询中使用解析 min() 计算您的标志,并根据它进行过滤。

计算的 IND 对于返回的所有行都是相同的。而且好像解析min()就够了,不用计算max()。按 IND=1 筛选。如果 min() over()=0,它将不返回任何行,并且不会覆盖表。

--enable dynamic partitioning
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

insert overwrite table temp.master PARTITION(dummy_part)
select s.col1, s.col2, --list all columns here you need to insert
'dummy_value' as dummy_part --dummy partition column
from
(
select s.*,
min(case when s.program_type_cd=m.program_type_cd then 1 else 0 end ) over() as IND
from source s left join master m
on s.program_type_cd=m.program_type_cd
)s where ind=1 --filter will not return rows if min=0

关于hadoop - Hive:有条件地截断并加载表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50604738/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com