2015-07-10 85 views
5

我想不出我如何處理這個問題:蜂巢 - LIKE操作

這是我的數據:

Table1:   Table2: 
BRAND   PRODUCT   SOLD 
Sony   Sony ABCD   1233 
Apple   Sony adv   1233 
Google   Sony aaaa   1233 
IBM    Apple 123   1233 
etc.   Apple 345   1233 
       IBM 13123   1233 

是否有可能在那裏矗立着篩選,我有一個表的查詢品牌和總銷量? 我的想法是:

Select table1.brand, sum(table2.sold) from table1 
join table2 
on (table1.brand LIKE '%table2.product%') 
group by table.1.brand 

這是我的想法,但我總是得到一個錯誤

最大的問題是像運營商或者有沒有其他的解決辦法?

+0

http://stackoverflow.com/questions/40628396/hive-like-operator請檢查並建議對於上面類似的Quear。 謝謝 –

回答

7

我看到兩個問題:首先,配置單元中的JOIN只能在平等條件下工作,而不會在那裏工作。

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

只有平等連接,外連接,並留下半聯接在蜂巢的支持。 Hive不支持非平等條件的連接條件,因爲很難表達地圖/縮減作業等條件。

相反,它想要進入where子句。

其次,我也看到類似聲明本身的問題:'%table2.product%'被解釋爲字面上'%table2.product%'字符串。另外,即使這樣做是爲了達到目的,它會嘗試在品牌內部尋找table2.product,當你似乎想要另一種方式時。爲了獲得您想要的評估,您需要將通配符添加到table1.brand的內容;爲了實現這一點,你想要將你的通配符連接到你的表達式中。

table2.product LIKE concat('%',table1.brand,'%')) 

通過這樣做,你喜歡將評估字符串 '%索尼%', '%蘋果%' ...等,而不是 '%table2.product%'。

你想要的是布蘭登·貝爾的查詢,我已經合併到這樣的回答:

SELECT table1.brand, SUM(table2.sold) 
FROM table1, table2 
WHERE table2.product LIKE concat('%', table1.brand, '%') 
GROUP BY table1.brand; 
4

你應該能夠做到這一點沒有JOIN。請參見下面的查詢:

SELECT table1.brand, sum(table2.sold) 
FROM table1, table2 
WHERE table2.product LIKE concat('%', table1.brand, '%') 
GROUP BY table1.brand; 

這將返回

Apple 2466 
IBM  1233 
Sony 3699 

凡我輸入文件如下:

Sony 
Apple 
Google 
IBM  

Sony ABCD  1233 
Sony adv  1233 
Sony aaaa  1233 
Apple 123  1233 
Apple 345  1233 
IBM 13123  1233 
+0

只是爲了澄清隱式聯接是聯接。表現明智,他們應該是一樣的。 「FROM a,b WHERE a.ID = b.ID」是「FROM a JOIN b ON a.ID = b.ID」的語法糖。 :) – invoketheshell

+0

感謝您的澄清。 –