1、遇到乙個hive的問題,如下hive sql:
select t1.a,t1.b from table t1 join table2 t2 on ( t1.a=t2.a and t1.datecol=20110802)
該語句中b表有30億行記錄,t1表只有100行記錄,而且t2表中資料傾斜特別嚴重,有乙個key上有15億行記錄,在執行過程中特別的慢,而且在reduece的過程中遇有記憶體不夠而報錯。
為了解決使用者的這個問題,考慮使用mapjoin,mapjoin的原理:
mapjion會把小表全部讀入記憶體中,在map階段直接拿另外乙個表的資料和記憶體中表資料做匹配,而普通的equality join則是類似於mapreduce模型中的file join,需要先分組,然後再reduce端進行連線,使用的時候需要結合著場景;由於mapjoin是在map是進行了join操作,省去了reduce的執行,效率也會高很多
這樣就不會由於資料傾斜導致某個reduce上落資料太多而失敗。於是原來的sql可以通過使用hint的方式指定join時使用mapjoin。
select /*+ mapjoin(t1)*/ t1.a,t1.b from table t1 join table2 t2 on ( t1.a=t2.a and f.ftime=20110802)
再執行發現執行的效率比以前的寫法高了好多。
2、mapjoin還有乙個很大的好處是能夠進行不等連線的join操作,如果將不等條件寫在where中,那麼mapreduce過程中會進行笛卡爾積,執行效率特別低,這是由於equality join (不等值join操作有 >、<、like等如:a.x < b.y 或者 a.x like b.y) 需要在reduce端進行不等值判斷,map端只能過濾掉where中等值連線時候的條件,如果使用mapjoin操作,在map的過程中就完成了不等值的join操作,效率會高很多。
select a.a ,a.b from a join b where a.a>b.a
3、mapjoin 不能使用與 outer join
select /*+ mapjoin(t1)*/ t2.juid from t_pvjoinvv t1
left outer join
(select distinct juid from t_vvformat where start_date=20130306 and flag=1 and sourceid<3 ) t2
on t1.juid=t2.juid
where t1.start_date=20130306
and t1.pv_1stflag=1
and t2.juid is null ;
" ;
丟擲異常:
ok
time taken: 1.957 seconds
failed: error in semantic analysis: mapjoin cannot be performed with outer join
簡單總結一下,mapjoin的使用場景:
1. 關聯操作中有一張表非常小
2.不等值的鏈結操作
使用xampp和wordpress搭建個人部落格
早期記錄的搭建wordpress的文章,雖然現在不用wordpress,但總歸是自己的記錄,收一下好了。記錄一下搭建部落格的過程,以及各種配置。好記性不如爛筆頭。個人使用的是arch,至於linux的安裝,可以參考這篇 archlinux的安裝 以各種方式獲取xampp到伺服器上後,可以開始我們的安...
總結乙個報錯和tensorboard使用
1 關於引用未授權的錯誤import not authorized rospy error constitute.c writeimage 1028.今天在除錯 的時候遇到乙個引用未授權的bug,記錄一下。import not authorized rospy error constitute.c ...
使用繼承和使用組合的乙個例子
需求如下 實現對帳功能 兩個平台用來保持資料一致性的乙個方法 有兩種方式,一種是已經有完整的對帳記錄,可直接拿來對帳,另一種只提供乙個關鍵字,對帳之前需要先根據該關鍵字查詢以獲得對帳記錄。對帳功能在現有系統中已有兩個版本的實現了 一種是定時對帳,另一種是手工填寫資訊進行對帳。這兩種可歸納為同一種型別...