2015-06-10 40 views
4

减法查询似乎不适用于HIVE。在HIVE中减法查询

尝试前:

select x from abc 
minus 
select x from bcd ; 

我这样做不对或减去查询没有为HIVE定义?如果是这样,是否有任何其他方式来得到这个结果?

回答

11

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) 
+0

的LEFT JOIN一件作品,但不会再EXISTS一个由HIVE似乎 – Macopare

+0

@Macopare感谢您的反馈意见是不支持。我不太常用'NOT EXISTS',所以我不知道。 –

3

HQL不支持减号,但您始终可以使用Patrick Tucci解决方案,当您的选择列表只包含几个字段时,它可以正常工作。在我的情况下,我想找到整个表(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