如何使用其他表的数据更新Hive中表的某些列

时间:2016-10-18 06:22:55

标签: hive

我想从另一个表中更新一个表中某些列的数据。

对于cust_tabl表中的这三列cf_mng,cf_sds,cf_htg,没有数据。

我想更新cust_tabl的这三列cf_mng,cf_sds,cf_htg的数据 使用custom_hist表的三列cust_cd_cnt_1,cust_cd_cnt_2,cust_cd_cnt_3的数据。

此表格包含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); 

请帮帮我。

提前致谢。

1 个答案:

答案 0 :(得分:1)

按主键加入表并覆盖已连接的分区。检查主键。连接基数应为1:1或1:0,否则您应该应用一些row_numberrank或某些聚合(如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;