2015-06-10 57 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