Hive中join的方式有哪些,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
創(chuàng)新互聯(lián)是專業(yè)的前進(jìn)網(wǎng)站建設(shè)公司,前進(jìn)接單;提供成都網(wǎng)站建設(shè)、成都網(wǎng)站制作,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行前進(jìn)網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
hive在實(shí)際的應(yīng)用過程中,大部份分情況都會(huì)涉及到不同的表格的連接,例如在進(jìn)行兩個(gè)table的join的時(shí)候,利用MR的思想會(huì)消耗大量的內(nèi)存,良妃磁盤的IO,大幅度的影響性能,因?yàn)閟huffle真的好令人擔(dān)心啊,總之,就是各種問題都是由他產(chǎn)生的。下面介紹一下涉及hive在join的時(shí)候的優(yōu)化方式
第一:在map端產(chǎn)生join
mapJoin的主要意思就是,當(dāng)鏈接的兩個(gè)表是一個(gè)比較小的表和一個(gè)特別大的表的時(shí)候,我們把比較小的table直接放到內(nèi)存中去,然后再對(duì)比較大的表格進(jìn)行map操作。join就發(fā)生在map操作的時(shí)候,每當(dāng)掃描一個(gè)大的table中的數(shù)據(jù),就要去去查看小表的數(shù)據(jù),哪條與之相符,繼而進(jìn)行連接。這里的join并不會(huì)涉及reduce操作。map端join的優(yōu)勢(shì)就是在于沒有shuffle,真好。在實(shí)際的應(yīng)用中,我們這樣設(shè)置:
[sql] view plain copy
set hive.auto.convert.join=true;
這樣設(shè)置,hive就會(huì)自動(dòng)的識(shí)別比較小的表,繼而用mapJoin來實(shí)現(xiàn)兩個(gè)表的聯(lián)合??纯聪旅娴膬蓚€(gè)表格的連接。這里的dept相對(duì)來講是比較小的。我們看看會(huì)發(fā)生什么,如圖所示:
注意看啦,這里的第一句話就是運(yùn)行本地的map join任務(wù),繼而轉(zhuǎn)存文件到XXX.hashtable下面,在給這個(gè)文件里面上傳一個(gè)文件進(jìn)行map join,之后才運(yùn)行了MR代碼去運(yùn)行計(jì)數(shù)任務(wù)。說白了,在本質(zhì)上mapjoin根本就沒有運(yùn)行MR進(jìn)程,僅僅是在內(nèi)存就進(jìn)行了兩個(gè)表的聯(lián)合。具體運(yùn)行如下圖:
common join也叫做shuffle join,reduce join操作。這種情況下生再兩個(gè)table的大小相當(dāng),但是又不是很大的情況下使用的。具體流程就是在map端進(jìn)行數(shù)據(jù)的切分,一個(gè)block對(duì)應(yīng)一個(gè)map操作,然后進(jìn)行shuffle操作,把對(duì)應(yīng)的block shuffle到reduce端去,再逐個(gè)進(jìn)行聯(lián)合,這里優(yōu)勢(shì)會(huì)涉及到數(shù)據(jù)的傾斜,大幅度的影響性能有可能會(huì)運(yùn)行speculation,這塊兒在后續(xù)的數(shù)據(jù)傾斜會(huì)講到。因?yàn)槠匠N覀冇玫降臄?shù)據(jù)量小,所以這里就不具體演示了。
第三:SMBJoin
smb是sort merge bucket操作,首先進(jìn)行排序,繼而合并,然后放到所對(duì)應(yīng)的bucket中去,bucket是hive中和分區(qū)表類似的技術(shù),就是按照key進(jìn)行hash,相同的hash值都放到相同的buck中去。在進(jìn)行兩個(gè)表聯(lián)合的時(shí)候。我們首先進(jìn)行分桶,在join會(huì)大幅度的對(duì)性能進(jìn)行優(yōu)化。也就是說,在進(jìn)行聯(lián)合的時(shí)候,是table1中的一小部分和table1中的一小部分進(jìn)行聯(lián)合,table聯(lián)合都是等值連接,相同的key都放到了同一個(gè)bucket中去了,那么在聯(lián)合的時(shí)候就會(huì)大幅度的減小無關(guān)項(xiàng)的掃描。
看完上述內(nèi)容,你們掌握Hive中join的方式有哪些的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!