如何用其他表的数据更新配置单元中表的某些列

uqdfh47h  于 2021-06-28  发布在  Hive
关注(0)|答案(1)|浏览(316)

我想从另一个表中更新一个表中某些列的数据。
对于这三列 cf_mng,cf_sds,cf_htg 在table上 cust_tabl 没有数据。
我想更新这三列的数据 cf_mng,cf_sds,cf_htgcust_tabl 用三列的数据 cust_cd_cnt_1,cust_cd_cnt_2,cust_cd_cnt_3custom_hist table。
此表包含从201505到201509的数据。

CREATE TABLE custom_hist( 
 cust_no varchar(20),    
 cust_cd_cnt_1 float,  
 cust_cd_cnt_2 float,  
 cust_cd_cnt_3 float,  
 cust_dt date,
 cust_name string) 
 PARTITIONED BY (yyyymm int);

此表包含从201403到201606的数据。

CREATE TABLE cust_tabl(
cust_no string,  
cf_mng double,  
cf_sds double,  
cf_htg double,  
cust_loc string,  
cust_region string,  
cust_country string,
cust_reg_id smallint)
PARTITIONED BY (yyyymm int);

请帮帮我。

zwghvu4y

zwghvu4y1#

按主键联接表并覆盖联接的分区。检查主键。连接基数应该是1:1或1:0,否则应该应用一些 row_number 或者 rank 或者类似的 max() 要限制联接后的行:

set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.dynamic.partition=true;

insert overwrite table cust_tabl partition (yyyymm)
select 
      c.cust_no,
      coalesce(h.cust_cd_cnt_1,c.cf_mng) as cf_mng, --take history column if joined
      coalesce(h.cust_cd_cnt_2,c.cf_sds) as cf_sds, --take original if not joined
      coalesce(h.cust_cd_cnt_3,c.cf_htg) as cf_htg,
      c.cust_loc,  --original columns
      c.cust_region,
      c.cust_country,
      c.cust_reg_id,
      c.yyyymm     --partition is the last
  from cust_tabl c
       left join custom_hist h 
                 --assume this is the primary key:
                 on c.cust_no = h.cust_no and c.yyyymm = h.yyyymm;

相关问题