HIVE:用外連接替代子查詢


由於hive也支持sql,很多人會把hql跟標准sql進行比較,甚至有的時候會直接套用。hive不支持事務也不支持索引,更不支持追加寫,但是對於一般的sql都是能夠支持的。但是對於一些子查詢確實無法支持的,例如

select * from t_ext_1_bkdoubledelete where f1=(select max(f1) from t_ext_1_bkdoubledelete)

  這個sql在mysql中是能夠支持的,意思是找到val最大的那一行記錄,然后在hive中運行確實報錯的;替代的是用左外連接:

select * from (select max(f1) as maxf1 from t_ext_1_bkdoubledelete) t1  left outer join (select * from t_ext_1_bkdoubledelete) t2 on t1.maxf1=t2.f1

  在上面的外連接中,先生成一個臨時表t1獲取其中最大的值max(f1),然后以max(f1)為左值,通過對自己的連接獲取到相關的行;從而獲取到最大行;

 

      下面的這個例子更有意義,使用外連接獲取到用戶的瀏覽記錄。用戶訪問apapche后留下一條訪問記錄,對apache log的一個數據分析,現在hive里有一個表,一個字段是url,就是請求的網頁的url,然后一個字段是time,按時間排序,想要得到所有的在訪問百度之后訪問的url,就比如說我訪問了www.baidu.com,然后我訪問了淘寶,那么www.taobao.com就是結果中的一條數據。

       

select t1.time1,t1.fromurl,t2.tourl from 
(select time time1,url fromurl,userid from urlLog) t1
left outer join
urlLog t2
on t1.userid=t2.userid
where t1.time1<t2.time and fromurl="www.baidu.com"

  

更加蛋疼的例子,可以看這個:

http://bbs.csdn.net/topics/390414342

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM