减去 HIVE 中的查询
Minus query in HIVE
减号查询似乎在 HIVE 中不起作用。
试过例如:
select x from abc
minus
select x from bcd ;
我是不是做错了,或者没有为 HIVE 定义减号查询?如果是这样,还有其他方法可以得到这个结果吗?
HQL似乎不支持MINUS
运算符。看到这个相关的,虽然有点旧,资源:
http://www.quora.com/Apache-Hive/What-are-the-biggest-feature-gaps-between-HiveQL-and-SQL
你想做的可以用 LEFT JOIN
或 NOT EXISTS
来完成:
SELECT x
FROM abc
LEFT JOIN bcd
ON abc.x = bcd.x
WHERE bcd.x IS NULL
编辑:根据下面的评论,NOT EXISTS
不受支持。
SELECT x
FROM abc
WHERE NOT EXISTS (SELECT x FROM bcd)
此时,Hive 不支持 MINUS
功能。参见 http://www.quora.com/Apache-Hive/What-are-the-biggest-feature-gaps-between-HiveQL-and-SQL
HQL 不支持减号,但您始终可以使用 Patrick Tucci 解决方案,当您的 select-list 仅包含几个字段时,该解决方案工作正常。就我而言,我想找到整个 table(30 多个字段)和备份副本之间的差异,以查找不同的记录。这是我的解决方案:
select <all-my-fields>, count(*)
from (
select <all-my-fields> from mytable
union all
select <all-the-fields> from mybackuptable
) merged_data
group by <all-my-fields>
having count(*) = 1
现在这不完全是一个“减号”,因为来自 mybackuptable 的单个记录会出现在我想要的结果中。为了使它成为一个完整的“负”等价物,我添加了这个:
select <all-my-fields>
from (
select max(source) source, <all-my-fields>, count(*)
from (
select 1 source, <all-my-fields> from mytable
union all
select 2 source, <all-the-fields> from mybackuptable
) merged_data
group by <all-my-fields>
having count(*) = 1
) minus_data
where source = 1
NOT EXISTS
在 HIVE QL 中受支持。
示例:
SELECT col1 FROM table1 WHERE NOT EXISTS SELECT col2 FROM table2
WHERE table1.col1 = table2.col2
如果格式略有不同,上述查询可能更易于阅读:
SELECT col1
FROM table1
WHERE NOT EXISTS (
SELECT col2
FROM table2
WHERE table1.col1 = table2.col2
)
这是一个相关的子查询。也就是说,外部查询通过引用外部查询的子查询中包含的连接与内部(子)查询相关联。
将 tbl1 连接到 tbl2 后,该连接的结果(即在本例中,存在于 table1.col1 和 table2.col2 中的 col2 值的列表)应用 NOT Exists 以从表 1 中的 col1 值列表。
结果是 table1 中没有出现在 table2 中的 col1 值的列表。
Table2 中不存在于 table1 中的任何 "extra" 值都不会参与此查询,因为它们已被内部联接删除。这很好,因为查询试图 return table1 中不在 table2 中的那些值 - table2 中的额外值首先不在 table1 中 - 因此它们是无关紧要的。
减号查询似乎在 HIVE 中不起作用。
试过例如:
select x from abc
minus
select x from bcd ;
我是不是做错了,或者没有为 HIVE 定义减号查询?如果是这样,还有其他方法可以得到这个结果吗?
HQL似乎不支持MINUS
运算符。看到这个相关的,虽然有点旧,资源:
http://www.quora.com/Apache-Hive/What-are-the-biggest-feature-gaps-between-HiveQL-and-SQL
你想做的可以用 LEFT JOIN
或 NOT EXISTS
来完成:
SELECT x
FROM abc
LEFT JOIN bcd
ON abc.x = bcd.x
WHERE bcd.x IS NULL
编辑:根据下面的评论,NOT EXISTS
不受支持。
SELECT x
FROM abc
WHERE NOT EXISTS (SELECT x FROM bcd)
此时,Hive 不支持 MINUS
功能。参见 http://www.quora.com/Apache-Hive/What-are-the-biggest-feature-gaps-between-HiveQL-and-SQL
HQL 不支持减号,但您始终可以使用 Patrick Tucci 解决方案,当您的 select-list 仅包含几个字段时,该解决方案工作正常。就我而言,我想找到整个 table(30 多个字段)和备份副本之间的差异,以查找不同的记录。这是我的解决方案:
select <all-my-fields>, count(*)
from (
select <all-my-fields> from mytable
union all
select <all-the-fields> from mybackuptable
) merged_data
group by <all-my-fields>
having count(*) = 1
现在这不完全是一个“减号”,因为来自 mybackuptable 的单个记录会出现在我想要的结果中。为了使它成为一个完整的“负”等价物,我添加了这个:
select <all-my-fields>
from (
select max(source) source, <all-my-fields>, count(*)
from (
select 1 source, <all-my-fields> from mytable
union all
select 2 source, <all-the-fields> from mybackuptable
) merged_data
group by <all-my-fields>
having count(*) = 1
) minus_data
where source = 1
NOT EXISTS
在 HIVE QL 中受支持。
示例:
SELECT col1 FROM table1 WHERE NOT EXISTS SELECT col2 FROM table2
WHERE table1.col1 = table2.col2
如果格式略有不同,上述查询可能更易于阅读:
SELECT col1
FROM table1
WHERE NOT EXISTS (
SELECT col2
FROM table2
WHERE table1.col1 = table2.col2
)
这是一个相关的子查询。也就是说,外部查询通过引用外部查询的子查询中包含的连接与内部(子)查询相关联。
将 tbl1 连接到 tbl2 后,该连接的结果(即在本例中,存在于 table1.col1 和 table2.col2 中的 col2 值的列表)应用 NOT Exists 以从表 1 中的 col1 值列表。 结果是 table1 中没有出现在 table2 中的 col1 值的列表。
Table2 中不存在于 table1 中的任何 "extra" 值都不会参与此查询,因为它们已被内部联接删除。这很好,因为查询试图 return table1 中不在 table2 中的那些值 - table2 中的额外值首先不在 table1 中 - 因此它们是无关紧要的。