减去 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 JOINNOT 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 中 - 因此它们是无关紧要的。