HIVE UNION ALL 带子句
Posted
技术标签:
【中文标题】HIVE UNION ALL 带子句【英文标题】:HIVE UNION ALL with clause 【发布时间】:2016-07-28 19:45:20 【问题描述】:我有下面的mysql更新语句。我正在尝试使用 hive 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 个如果主键相等,另一个如果它们不相等。
以上查询是针对相等的PK条件。 其中 Id 是 PK。请提供任何帮助。对此进行了相当长的研究。
【问题讨论】:
您遇到的具体错误是什么? 【参考方案1】:.14 版之前的 Hive 中的更新是插入覆盖表或分区。 您需要 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 中实现你的相等/不相等逻辑。
您还需要仔细检查连接不会创建重复项。
【讨论】:
以上是关于HIVE UNION ALL 带子句的主要内容,如果未能解决你的问题,请参考以下文章
ORACLE 11G 中的 WITH 子句使用 UNION ALL
Mysql Unknown column in where 子句 union all
使用 UNION ALL 查询在 FROM 子句中出现语法错误
在 Toad for Sql Server 2016 中使用带有 Union All 的 Order By 子句时出现奇怪的语法错误