2016-07-28 74 views
0

我有下面的mysql更新语句。我想这个转换成使用蜂巢13. HQL(所以我没有在任何蜂巢更新语句)HIVE联盟所有条款

UPDATE MY_TABLE.STORE SET 
    ADDRESS1 = b.addr_line_1 
    ,ADDRESS3 = b.city + ', ' + b.state + ' ' + b.postal_cde 
FROM 
    MY_TABLE.STORE a INNER JOIN 
    CUST b ON 
    a.REGION = b.LOC_NUM 
    AND a.STORENUMBER = b.cust_num; 


UPDATE MY_TABLE.STORE SET 
    STORETYPE = b.abc_num 
FROM 
    MY_TABLE.STORE a INNER JOIN 
    RLT b ON 
    a.REGION = b.LOC_NUM 
    AND a.STORENUMBER = b.CUST_NUM; 

下面是我的查询:

insert into table X 
select b.addr_line_1,CONCAT(B.CITY, ', ', B.STATE, ' ', B.POSTAL_CDE),STORETYPE 
from MY_TABLE.STORE A JOIN CUST b ON a.REGION = b.LOC_NUM 
    AND a.STORENUMBER = b.cust_num t1 

UNION ALL 
select ADDRESS1 ,ADDRESS3 ,b.abc_num from MY_TABLE.STORE a INNER JOIN 
    RLT b ON 
    a.REGION = b.LOC_NUM 
    AND a.STORENUMBER = b.CUST_NUM t2 on t1.id <> t2.id; 

上面的查询抛出一个错误解析。 我知道应该有2个查询,如果主键相同则为1,如果不相等则为1。

以上查询是针对相同的PK条件。 其中Id是PK。请任何帮助。对此已经有相当长的研究。

+0

你得到的具体错误是什么? – gobrewers14

回答

0

在版本.14之前的Hive中的更新是INSERT OVERWRITE TABLE OR PARTITION。 您需要使用LEFT JOIN从STORE中选择所有行,包括已更新和未更新。 检入CASE语句哪个表已加入。 使用如下因素查询作为模板:

INSERT OVERWRITE TABLE STORE 
SELECT 
-- fields should be in the same order like in target table (STORE) 
--update all joined records, leave as is if not joined: 

case when c.LOC_NUM is not null then c.addr_line_1 --first table joined 
    when r.LOC_NUM is not null then r.addr_line_1 --second table joined 
    else s.address1        --not joined 
end                 as address1, 

    ... 

FROM STORE s 
    LEFT JOIN CUST c ON s.REGION = c.LOC_NUM 
        AND s.STORENUMBER = c.cust_num 
    LEFT JOIN RLT r ON s.REGION = r.LOC_NUM 
        AND s.STORENUMBER = r.CUST_NUM ; 

也实现你等于/不等于逻辑的情况下。

此外,您还需要仔细检查连接是否不会创建重复项。