通用的删除SQL语句:
delete from ODS_DPFM02 a
where exists (
select 1 from ODS_DPFM18 d
where a.DM02ACCT = d.DM18ACCT
and a.DM02ACCS = d.DM18ACCS
);
通用的更新SQL语句:
update ODS_DPFM02 a set a.DM02BALE = (
select d.DM18REAMT from ODS_DPFM18 d
where a.DM02ACCT = d.DM18ACCT
and a.DM02ACCS = d.DM18ACCS
);
修改后的Impala中的删除SQL语句:
Insert overwrite table ODS_DPFM02 PARTITION (DM02NODE)
select a.* from ODS_DPFM02 a
where not exists (
select 1 from ODS_DPFM18 d
where a.DM02ACCT = d.DM18ACCT
and a.DM02ACCS = d.DM18ACCS
);
注:当select a.* from ODS_DPFM02 ....结果是0条时,由于该语句是动态分区的方式覆盖插入,系统找不到需要插入的分区,所以表中的数据依旧不变(也就是没有达到清空的效果)。结果是0条时只对不是分区表有效,或指定区分的表有效(分区依然在只是该分区中的数据清零了)。
修改后的Impala中的更新SQL语句:
Insert overwrite table ODS_DPFM02 PARTITION (DM02NODE)
select t.* from (
select a.DM02ACCT,
a.DM02ACCS,
a.DM02CCY,
d.DM18REAMT as DM02BALE,
a.DM02NODE
from ODS_DPFM02 a
join ODS_DPFM18 d
on a.DM02ACCT = d.DM18ACCT
and a.DM02ACCS = d.DM18ACCS
UNION ALL
select a.*
from ODS_DPFM02 a
where not exists (
select 1 from ODS_DPFM18 d
where a.DM02ACCT = d.DM18ACCT
and a.DM02ACCS = d.DM18ACCS
)
) t;
注:当然Impala与Hbase关联表也能变相的实现更新,相同Rowkey的数据插入时,会自动覆盖原有的列族的值。