Hive 如何使用mapjoin

MapJoin是Hive的一種優(yōu)化操作,其適用于小表JOIN大表的場景,由于表的JOIN操作是在Map端且在內(nèi)存進(jìn)行的,所以其并不需要啟動Reduce任務(wù)也就不需要經(jīng)過shuffle階段,從而能在一定程度上節(jié)省資源提高JOIN效率

簡單總結(jié)一下,mapjoin的使用場景:

1. 關(guān)聯(lián)操作中有一張表非常小

2.不等值的鏈接操作


具體使用:

方法一:

在Hive0.11前,必須使用MAPJOIN來標(biāo)記顯示地啟動該優(yōu)化操作,由于其需要將小表加載進(jìn)內(nèi)存所以要注意小表的大小

SELECT/*+ MAPJOIN(smalltable)*/.key,valueFROMsmalltableJOINbigtableONsmalltable.key=bigtable.key

方法二

在Hive0.11后,Hive默認(rèn)啟動該優(yōu)化,也就是不在需要顯示的使用MAPJOIN標(biāo)記,其會在必要的時候觸發(fā)該優(yōu)化操作將普通JOIN轉(zhuǎn)換成MapJoin,可以通過以下兩個屬性來設(shè)置該優(yōu)化的觸發(fā)時機(jī)

hive.auto.convert.join

默認(rèn)值為true,自動開戶MAPJOIN優(yōu)化

hive.mapjoin.smalltable.filesize

默認(rèn)值為2500000(25M),通過配置該屬性來確定使用該優(yōu)化的表的大小,如果表的大小小于此值就會被加載進(jìn)內(nèi)存中


注意:使用默認(rèn)啟動該優(yōu)化的方式如果出現(xiàn)默名奇妙的BUG(比如MAPJOIN并不起作用),就將以下兩個屬性置為fase手動使用MAPJOIN標(biāo)記來啟動該優(yōu)化

hive.auto.convert.join=false(關(guān)閉自動MAPJOIN轉(zhuǎn)換操作)

hive.ignore.mapjoin.hint=false(不忽略MAPJOIN標(biāo)記)


對于以下查詢是不支持使用方法二(MAPJOIN標(biāo)記)來啟動該優(yōu)化的

select/*+MAPJOIN(smallTableTwo)*/idOne, idTwo, valueFROM? ( select/*+MAPJOIN(smallTableOne)*/idOne, idTwo, valueFROM? ? bigTable JOINsmallTableOneon(bigTable.idOne= smallTableOne.idOne)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ) firstjoin? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? JOIN? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? smallTableTwo ON(firstjoin.idTwo=smallTableTwo.idTwo)

但是,如果使用的是方法一即沒有MAPJOIN標(biāo)記則以上查詢語句將會被作為兩個MJ執(zhí)行,進(jìn)一步的,如果預(yù)先知道表大小是能夠被加載進(jìn)內(nèi)存的,則可以通過以下屬性來將兩個MJ合并成一個MJ

hive.auto.convert.join.noconditionaltask:Hive在基于輸入文件大小的前提下將普通JOIN轉(zhuǎn)換成MapJoin,并是否將多個MJ合并成一個

hive.auto.convert.join.noconditionaltask.size:多個MJ合并成一個MJ時,其表的總的大小須小于該值,同時hive.auto.convert.join.noconditionaltask必須為true

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容