由于hive也支持sql,很多人會(huì)把hql跟標(biāo)準(zhǔn)sql進(jìn)行比較,甚至有的時(shí)候會(huì)直接套用。hive不支持事務(wù)也不支持索引,更不支持追加寫,但是對(duì)于一般的sql都是能夠支持的。但是對(duì)于一些子查詢確實(shí)無法支持的,例如
select * from t_ext_1_bkdoubledelete where f1=(select max(f1) from t_ext_1_bkdoubledelete)
這個(gè)sql在mysql中是能夠支持的,意思是找到val最大的那一行記錄,然后在hive中運(yùn)行確實(shí)報(bào)錯(cuò)的;替代的是用左外連接:
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
在上面的外連接中,先生成一個(gè)臨時(shí)表t1獲取其中最大的值max(f1),然后以max(f1)為左值,通過對(duì)自己的連接獲取到相關(guān)的行;從而獲取到最大行;
?
? ? ? 下面的這個(gè)例子更有意義,使用外連接獲取到用戶的瀏覽記錄。用戶訪問apapche后留下一條訪問記錄,對(duì) apache?log的一個(gè)數(shù)據(jù)分析,現(xiàn)在hive里有一個(gè)表,一個(gè)字段是url,就是請(qǐng)求的網(wǎng)頁的url,然后一個(gè)字段是time,按時(shí)間排序,想要得到所有的在訪問百度之后訪問的url,就比如說我訪問了www.baidu.com,然后我訪問了淘寶,那么www.taobao.com就是結(jié)果中的一條數(shù)據(jù)。
? ? ? ?
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"
更加蛋疼的例子,可以看這個(gè):
http://bbs.csdn.net/topics/390414342
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
