Hive不支持非相等的join

因爲 hive 與傳統關係型數據庫面對的業務場景及底層技術架構都有着很大差別,所以,傳統數據庫領域的一些技能放到 Hive 中可能已再也不適用。關於 hive 的優化與原理、應用的文章,前面也陸陸續續的介紹了一些,但大多都偏向理論層面,本文就介紹一個實例,從實例中一步步加深對 hive 調優的認識與意識。算法

一、需求

需求我作了簡化,很簡單,兩張表作個 join,求指定城市,天天的 pv,用傳統的 RDBMS SQL 寫出來就這樣的:sql

SELECT t.statdate,  c.cname,  count(t.cookieid) FROM tmpdb.city c JOIN ecdata.ext_trackflow t ON (t.area1= c.cname     OR t.area2 =c.cname     OR t.area3 = c.cname) WHERE t.statdate>='20140818' and t.statdate<='20140824' AND platform='pc' GROUP BY t.statdate,  c.cname;

怎麼樣?根據 SQL 看懂需求沒問題吧?數據庫

二、非等值 join 問題

而後把這條 SQL 貼到 hive 中去執行,而後你會發現報錯了:ruby

FAILED: SemanticException [Error 10019]: Line 5:32 OR not supported in JOIN currently 'cname'

這是由於 hive 受限於 MapReduce 算法模型,只支持 equi-joins(等值 join),要實現上述的非等值 join,你能夠採用笛卡兒積( full Cartesian product )來實現:cookie

SELECT t.statdate,  c.cname,  count(t.cookieid) FROM tmpdb.city c JOIN ecdata.ext_trackflow t WHERE t.statdate>='20140818' AND t.statdate<='20140824' AND platform='pc' AND (t.area1= c.cname  OR t.area2 =c.cname  OR t.area3 = c.cname) GROUP BY t.statdate,  c.cname;

而後再拿着這條語句執行下。架構

 

改寫非等值 join:union all

既然不容許非等值 join,那咱們換一下思路,多個子查詢 union all,而後彙總:優化

SELECT dt, name, count(cid) FROM (SELECT t.statdate dt, c.cname name, t.cookieid cid FROM tmpdb.city c JOIN ecdata.ext_trackflow t ON t.area1 =c.cname WHERE t.statdate>='20140818' AND t.statdate<='20140824' AND platform='pc' UNION ALL SELECT t.statdate dt,  c.cname name,  t.cookieid cid FROM tmpdb.city c JOIN ecdata.ext_trackflow t ON t.area2 =c.cname WHERE t.statdate>='20140818' AND t.statdate<='20140824' AND platform='pc' UNION ALL SELECT t.statdate dt,  c.cname name,  t.cookieid cid FROM tmpdb.city c JOIN ecdata.ext_trackflow t ON t.area3 =c.cname WHERE t.statdate>='20140818' AND t.statdate<='20140824' AND platform='pc') tmp_trackflow GROUP BY dt, name;

 

 

 

形成這個的緣由是子查詢出來有字段相同,能夠改字段方式解決ui

select *
from
(select si.name as siname,gsi.name as gsiname from student_infos si join good_student_infos gsi on si.name = gsi.name ) st;spa

 

 

若是不出現重複字段不會報錯orm

 

聯合查詢代替hive不能join非相等查詢問題

相關文章
相關標籤/搜索