最近開發中遇到幾種應用,剛好使用mapjoin來解決實際的問題。
應用共同點如下:
1: 有乙個極小的表<1000行
2: 需要做不等值join操作(a.x < b.y 或者 a.x like b.y等)
這種操作如果直接使用join的話語法不支援不等於操作,hive語法解析會直接丟擲錯誤
如果把不等於寫到where裡會造成笛卡爾積,資料異常增大,速度會很慢。甚至會任務無法跑成功~
根據mapjoin的計算原理,mapjion會把小表全部讀入記憶體中,在map階段直接拿另外乙個表的資料和記憶體中表資料做匹配。這種情況下即使笛卡爾積也不會對任務執行速度造成太大的效率影響。
而且hive的where條件本身就是在map階段進行的操作,所以在where裡寫入不等值比對的話,也不會造成額外負擔。
如此看來,使用mapjoin開發的程式僅僅使用map乙個過程就可以完成不等值join操作,效率還會有很大的提公升。
問題解決~~
示例**如下:
select/*+ mapjoin(a) */
a.start_level, b.*
from dim_level a
join (select * from test) bwhere b.xx>=a.start_level and b.xx
3 mapjoin 結合 unionall
原始sql:
from
(select * from t_aa_pvid_ctr_hour_js_mes1
) aleft outer join
(select * fromt_qd_cmfu_book_info_mes
) c速度很慢,老辦法,先查下資料分布。
select *
from
fromt_aa_pvid_ctr_hour_js_mes1
order by cnt desc
limit 50;
資料分布如下:
na617370129 2
118293314 1
40673814 d
20151236 b
1846306 s
1124246 5
675240 8
642231 6
611104 t
596973 4
579473 3
489516 7
475999 9
373395
107580
10508
解決方案:
(select * fromt_aa_pvid_ctr_hour_js_mes1
) aleft outer join
(select * fromt_qd_cmfu_book_info_mes
where cast(book_id asint)>9) c
union all
select /*+ mapjoin(c)*/
(select * fromt_aa_pvid_ctr_hour_js_mes1
left outer join
(select * fromt_qd_cmfu_book_info_mes
where cast(book_id asint)<=9) c
hive 大小表mapjoin 遇到udf失效問題
開啟第乙個檔案發現udf函式沒找到,對比執行sql,on dwc mart.transtring a.altitem dwc mart.transtring b.pa code 使用了udf explain 執行語句,找到stage4,發現啟動了本地模式,本地模式下進行了mapjoin操作 開啟第三...
可以使用xmp格式預設嗎 強制傳喚可以使用警械嗎
強制傳喚是針對行政案件的,特別是違反治安管理處罰法的行為人,如果行為人沒有正當的理由而拒絕公安機關傳喚的,那麼可以強制傳喚。一 強制傳喚可以使用警械嗎 可以使用警械。強制傳喚,是公安機關在辦理行政案件時,對無正當理由不接受傳喚或者逃避傳喚的違反治安管理的違法嫌疑人,使用強制方法將其帶至公安機關或指定...
ABAP中可以使用的快捷鍵
建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 第一次寫abap的部落格,把快捷鍵相關mark一下 全新的介面設計,將會帶來全新的寫作體驗 在創作中心設定你喜愛的 高亮樣式,markdow...