HIVE UNION ALL with clause

时间:2016-07-28 19:45:20

标签: mysql hadoop hive

我有以下mysql更新语句。我试图使用配置单元13将其转换为hql。(所以我在配置单元中没有任何更新语句)

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。请帮忙。对此进行了长时间的研究。

1 个答案:

答案 0 :(得分: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 ;

在CASE中也实现等于/不等于逻辑。

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