2014-09-13 26 views
10

我無法通過使用下面的HIVE查詢來通過相等性檢查。連接表時Hive查詢中的錯誤

我有3桌,我想加入這些表。我嘗試如下,但得到的錯誤:

失敗:錯誤的語義分析:行3:40左右兩側的別名遇到JOIN「VISIT_DATE」

select t1.*, t99.* from table1 t1 JOIN 
    (select v3.*, t3.* from table2 v3 JOIN table3 t3 ON 
    (v3.AS_upc= t3.upc_no AND v3.start_dt <= t3.visit_date AND v3.end_dt >= t3.visit_date AND v3.adv_price <= t3.comp_price)) t99 ON 
    (t1.comp_store_id = t99.cpnumber AND t1.AS_store_nbr = t99.store_no); 

編輯基於幫助從FuzzyTree:

1st:

我們嘗試使用between和where子句編輯上述查詢,但未從查詢中獲取任何輸出。

但是,如果我們通過刪除between子句與日期來更改上述查詢,那麼我得到了一些基於「v3.adv_price < = t3.comp_price」的輸出,但沒有使用「date filter」。

select t1.*, t99.* from table1 t1 JOIN 
    (select v3.*, t3.* from table2 v3 JOIN table3 t3 on (v3.AS_upc= t3.upc_no) 
     where v3.adv_price <= t3.comp_price 
    ) t99 ON 
    (t1.comp_store_id = t99.cpnumber AND t1.AS_store_nbr = t99.store_no); 

第二:

接下來,我們試圖通過只有一個日期:

select t1.*, t99.* from table1 t1 JOIN 
     (select v3.*, t3.* from table2 v3 JOIN table3 t3 on (v3.AS_upc= t3.upc_no) 
      where v3.adv_price <= t3.comp_price and v3.start_dt <= t3.visit_date 
     ) t99 ON 
     (t1.comp_store_id = t99.cpnumber AND t1.AS_store_nbr = t99.store_no); 

所以,現在它顯示出一些結果,但如果我們通過雙方的開始和結束日期過濾器,它;沒有顯示任何結果。

回答

28

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins

只有平等連接,外連接,並留下半聯接在 蜂巢的支持。 Hive不支持不相等 條件的連接條件,因爲很難表示諸如 映射/縮減作業之類的條件。

請嘗試移動不平等的where條款

select t1.*, t99.* from table1 t1 JOIN 
    (select v3.*, t3.* from table2 v3 JOIN table3 t3 on (v3.AS_upc= t3.upc_no) 
     where t3.visit_date between v3.start_dt and v3.end_dt 
     and v3.adv_price <= t3.comp_price 
    ) t99 ON 
    (t1.comp_store_id = t99.cpnumber AND t1.AS_store_nbr = t99.store_no); 
+1

我編輯的查詢基於你的幫助,但仍無法從查詢的輸出。我已更新了我的原始帖子。 – Abhi 2014-09-16 20:48:38

+0

我遇到了同樣的問題。解決方案建議是好的。不過我注意到錯誤信息可以改進。這是誤導。 – paolov 2017-01-31 05:55:21