本發(fā)明涉及spark大數(shù)據(jù)處理技術(shù)領(lǐng)域,特別是涉及一種sparkbroadcasthashjoin操作的改進(jìn)方法。
背景技術(shù):
目前,spark是近年來(lái)發(fā)展較快的分布式并行大數(shù)據(jù)處理框架,sparksql提供了對(duì)結(jié)構(gòu)化數(shù)據(jù)的處理。broadcasthashjoin是sparksql中的一項(xiàng)重要操作,用于處理多表連接。broadcasthashjoin是對(duì)join操作的優(yōu)化處理。
在sparksql中broadcasthashjoin首先使用broadcast把小表分發(fā)到每臺(tái)執(zhí)行節(jié)點(diǎn)上,然后利用小表中的key數(shù)據(jù)計(jì)算hash值建立哈希表,最后計(jì)算大表對(duì)應(yīng)的hash值,在hash表中進(jìn)行查找最終完成表的連接。broadcasthashjoin操作過(guò)程中需要利用小表來(lái)創(chuàng)建哈希表,創(chuàng)建哈希表的過(guò)程中不可避免的要解決相同key的沖突問(wèn)題,broadcasthashjoin操作中用鏈地址法來(lái)解決沖突。然而這種方法再處理沖突時(shí),往往不會(huì)考慮小表中數(shù)據(jù)被大表查找的先驗(yàn)概率大小。例如,小表中key值a位于key值b之前,二者對(duì)應(yīng)的哈希值相同,在創(chuàng)建哈希表時(shí)利用鏈地址法處理沖突會(huì)將b鏈接在a之后,而實(shí)際先驗(yàn)已知在大表中進(jìn)行查找連接操作時(shí),查找b的頻率遠(yuǎn)遠(yuǎn)高于a,那么此時(shí)查找效率將會(huì)非常低下,尤其是在處理大批相同哈希值的情況下。
在spark集群中直接join將會(huì)對(duì)所有數(shù)據(jù)進(jìn)行shuffle,需要大量的io操作,相同的key會(huì)在同一個(gè)partition中進(jìn)行處理,任務(wù)的并發(fā)度也受到了限制。broadcasthashjoin通過(guò)使用broadcast把小表分發(fā)到每臺(tái)執(zhí)行節(jié)點(diǎn)上,從而使得關(guān)聯(lián)操作都在本地完成,基本就取消了shuffle的過(guò)程,運(yùn)行效率大幅度提高。然而該操作同時(shí)也涉及到哈希表的創(chuàng)建和查找過(guò)程,以及哈希表創(chuàng)建過(guò)程中的沖突解決問(wèn)題。broadcasthashjoin利用鏈地址法來(lái)解決沖突。然而這種方法處理沖突時(shí)只是在每次遇到?jīng)_突時(shí)將對(duì)應(yīng)數(shù)據(jù)依次掛接在相同hash值對(duì)應(yīng)的鏈表里,并未考慮到小表中數(shù)據(jù)被大表查找的先驗(yàn)概率大小,也即大表中與小表中相同字段的概率大小,從而造成了后續(xù)大表join操作時(shí)查找連接效率較低。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的是提供一種sparkbroadcasthashjoin操作的改進(jìn)方法,以實(shí)現(xiàn)提高查找效率,進(jìn)而提高join的連接效率。
為解決上述技術(shù)問(wèn)題,本發(fā)明提供一種sparkbroadcasthashjoin操作的改進(jìn)方法,該方法包括:
獲取小表,并獲取小表中key值被大表查找的先驗(yàn)概率;
依據(jù)先驗(yàn)概率對(duì)小表中的key從大到小進(jìn)行排序,得到一個(gè)新的有序表;
利用所述新的有序表構(gòu)建哈希表,將哈希表廣播到各個(gè)節(jié)點(diǎn);
在各個(gè)節(jié)點(diǎn)獲取大表內(nèi)容,將大表內(nèi)容與哈希表中的匹配項(xiàng)進(jìn)行連接。
優(yōu)選的,小表中的每個(gè)key均對(duì)應(yīng)一個(gè)先驗(yàn)概率。
優(yōu)選的,所述利用所述新的有序表構(gòu)建哈希表,包括:
逐行計(jì)算小表中每行key的哈希值,將具有相同哈希值的key對(duì)應(yīng)的關(guān)鍵字都依次放在同一個(gè)鏈表中,構(gòu)成哈希表。
優(yōu)選的,所述哈希值為關(guān)鍵字的哈希地址。
優(yōu)選的,所述將具有相同哈希值的key對(duì)應(yīng)的關(guān)鍵字都依次放在同一個(gè)鏈表中,構(gòu)成哈希表之后,還包括:采用數(shù)組存放各個(gè)鏈表的頭指針。
優(yōu)選的,鏈表的數(shù)目和哈希地址的數(shù)目相同。
優(yōu)選的,所述將大表內(nèi)容與哈希表中的匹配項(xiàng)進(jìn)行連接,包括:
計(jì)算大表中各行key的哈希值,在哈希表中查找哈希值相同的匹配項(xiàng),將大表內(nèi)容與匹配項(xiàng)進(jìn)行連接。
本發(fā)明所提供的一種sparkbroadcasthashjoin操作的改進(jìn)方法,獲取小表,并獲取小表中key值被大表查找的先驗(yàn)概率;依據(jù)先驗(yàn)概率對(duì)小表中的key從大到小進(jìn)行排序,得到一個(gè)新的有序表;利用所述新的有序表構(gòu)建哈希表,將哈希表廣播到各個(gè)節(jié)點(diǎn);在各個(gè)節(jié)點(diǎn)獲取大表內(nèi)容,將大表內(nèi)容與哈希表中的匹配項(xiàng)進(jìn)行連接??梢?jiàn),該方法改進(jìn)了broadcasthashjoin操作,增加了小表中key值被大表查找的先驗(yàn)概率,小表中每個(gè)key均對(duì)應(yīng)一個(gè)先驗(yàn)被查找概率,在利用小表數(shù)據(jù)構(gòu)建哈希表時(shí)首先按照該先驗(yàn)概率對(duì)key從小到大進(jìn)行排序,排序后得到一個(gè)新的有序表,然后再對(duì)新的有序表進(jìn)行常規(guī)的哈希表構(gòu)建過(guò)程。由于用于構(gòu)建哈希表的小表中每個(gè)key被查找的概率不同,按被查找的先驗(yàn)概率大小來(lái)決定其沖突處理時(shí)的位置,將出現(xiàn)概率大的放在所需比較次數(shù)少的位置,從而減少后續(xù)大表查找連接操作時(shí)的查找次數(shù),提高查找效率,提高broadcasthashjoin的整體性能。并且將小表中數(shù)據(jù)元素被大表查找的先驗(yàn)概率作為建立哈希表時(shí)插入順序的依據(jù),使得查找連接過(guò)程與原操作相比在不增加過(guò)多其它消耗的同時(shí)降低了沖突時(shí)執(zhí)行查詢的查找長(zhǎng)度,從而使查詢響應(yīng)時(shí)間更短,進(jìn)而join的連接效率更高,提高join的連接效率。
附圖說(shuō)明
為了更清楚地說(shuō)明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見(jiàn)地,下面描述中的附圖僅僅是本發(fā)明的實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)提供的附圖獲得其他的附圖。
圖1為本發(fā)明所提供的一種sparkbroadcasthashjoin操作的改進(jìn)方法的流程圖;
圖2為現(xiàn)有技術(shù)中的sparkbroadcasthashjoin實(shí)現(xiàn)流程圖;
圖3為本發(fā)明改進(jìn)的sparkbroadcasthashjoin實(shí)現(xiàn)流程圖;
圖4為改進(jìn)前后哈希表示意圖。
具體實(shí)施方式
本發(fā)明的核心是提供一種sparkbroadcasthashjoin操作的改進(jìn)方法,以實(shí)現(xiàn)提高查找效率,進(jìn)而提高join的連接效率。
為了使本技術(shù)領(lǐng)域的人員更好地理解本發(fā)明方案,下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
請(qǐng)參考圖1,圖1為本發(fā)明所提供的一種sparkbroadcasthashjoin操作的改進(jìn)方法的流程圖,該方法包括:
s11:獲取小表,并獲取小表中key值被大表查找的先驗(yàn)概率;
s12:依據(jù)先驗(yàn)概率對(duì)小表中的key從大到小進(jìn)行排序,得到一個(gè)新的有序表;
s13:利用所述新的有序表構(gòu)建哈希表,將哈希表廣播到各個(gè)節(jié)點(diǎn);
s14:在各個(gè)節(jié)點(diǎn)獲取大表內(nèi)容,將大表內(nèi)容與哈希表中的匹配項(xiàng)進(jìn)行連接。
可見(jiàn),該方法改進(jìn)了broadcasthashjoin操作,增加了小表中key值被大表查找的先驗(yàn)概率,小表中每個(gè)key均對(duì)應(yīng)一個(gè)先驗(yàn)被查找概率,在利用小表數(shù)據(jù)構(gòu)建哈希表時(shí)首先按照該先驗(yàn)概率對(duì)key從小到大進(jìn)行排序,排序后得到一個(gè)新的有序表,然后再對(duì)新的有序表進(jìn)行常規(guī)的哈希表構(gòu)建過(guò)程。由于用于構(gòu)建哈希表的小表中每個(gè)key被查找的概率不同,按被查找的先驗(yàn)概率大小來(lái)決定其沖突處理時(shí)的位置,將出現(xiàn)概率大的放在所需比較次數(shù)少的位置,從而減少后續(xù)大表查找連接操作時(shí)的查找次數(shù),提高查找效率,提高broadcasthashjoin的整體性能。
并且將小表中數(shù)據(jù)元素被大表查找的先驗(yàn)概率作為建立哈希表時(shí)插入順序的依據(jù),使得查找連接過(guò)程與原操作相比在不增加過(guò)多其它消耗的同時(shí)降低了沖突時(shí)執(zhí)行查詢的查找長(zhǎng)度,從而使查詢響應(yīng)時(shí)間更短,進(jìn)而join的連接效率更高,提高join的連接效率。
基于上述方法,具體的,小表中的每個(gè)key均對(duì)應(yīng)一個(gè)先驗(yàn)概率。
進(jìn)一步的,步驟s13中,利用所述新的有序表構(gòu)建哈希表的過(guò)程具體為:逐行計(jì)算小表中每行key的哈希值,將具有相同哈希值的key對(duì)應(yīng)的關(guān)鍵字都依次放在同一個(gè)鏈表中,構(gòu)成哈希表。
其中,所述哈希值為關(guān)鍵字的哈希地址。
進(jìn)一步的,將具有相同哈希值的key對(duì)應(yīng)的關(guān)鍵字都依次放在同一個(gè)鏈表中,構(gòu)成哈希表之后,還包括:采用數(shù)組存放各個(gè)鏈表的頭指針。
其中,鏈表的數(shù)目和哈希地址的數(shù)目相同。
進(jìn)一步的,步驟s14中,將大表內(nèi)容與哈希表中的匹配項(xiàng)進(jìn)行連接的內(nèi)容具體為:計(jì)算大表中各行key的哈希值,在哈希表中查找哈希值相同的匹配項(xiàng),將大表內(nèi)容與匹配項(xiàng)進(jìn)行連接主要技術(shù)特征:
詳細(xì)的,傳統(tǒng)的sparkbroadcasthashjoin實(shí)現(xiàn)流程如圖2所示,具體的步驟為:(1)獲取小表t1;(2)構(gòu)建哈希表:逐行計(jì)算小表中每行key的哈希值,把具有相同哈希地址的關(guān)鍵字都依次放在同一個(gè)鏈表中,有m個(gè)哈希地址就有m個(gè)鏈表。同時(shí),用數(shù)組a[0..m-1]存放各個(gè)鏈表的頭指針,凡是哈希地址為i的記錄都以節(jié)點(diǎn)方式插入到以a[i]為頭節(jié)點(diǎn)的鏈表中;(3)將哈希表廣播到各個(gè)計(jì)算節(jié)點(diǎn);(4)在各節(jié)點(diǎn)獲取大表內(nèi)容,計(jì)算大表各行key的哈希值,在哈希表中查找匹配;(5)將大表內(nèi)容與找到的匹配項(xiàng)進(jìn)行連接并返回。
本方法是在小表中增加各key被查找的先驗(yàn)概率,在構(gòu)建哈希表之前加入對(duì)小表按照先驗(yàn)概率進(jìn)行排序的步驟,以此來(lái)調(diào)整后續(xù)構(gòu)建哈希表時(shí)小表中各鍵值在哈希表中的位置,從而達(dá)到盡量減少大表查找次數(shù),提高整體連接效率的目的。本發(fā)明改進(jìn)后的broadcasthashjoin操作實(shí)現(xiàn)如圖3所示,具體實(shí)現(xiàn)步驟為:(1)獲取小表t1;(2)按照先驗(yàn)概率大小對(duì)小表按照從大到小的順序進(jìn)行排序;(3)構(gòu)建哈希表:逐行計(jì)算小表中每行key的哈希值,把具有相同哈希地址的關(guān)鍵字都依次放在同一個(gè)鏈表中,有m個(gè)哈希地址就有m個(gè)鏈表。同時(shí),用數(shù)組a[0..m-1]存放各個(gè)鏈表的頭指針,凡是哈希地址為i的記錄都以節(jié)點(diǎn)方式插入到以a[i]為頭節(jié)點(diǎn)的鏈表中;(4)將哈希表廣播到各個(gè)計(jì)算節(jié)點(diǎn);(5)在各節(jié)點(diǎn)獲取大表內(nèi)容,計(jì)算大表各行key的哈希值,在哈希表中查找匹配;(6)將大表內(nèi)容與找到的匹配項(xiàng)進(jìn)行連接并返回。
本方法對(duì)broadcasthashjoin操作進(jìn)行改進(jìn),通過(guò)增加小表中key值被查找的先驗(yàn)概率來(lái)改變鏈地址法處理沖突的規(guī)則,從而提高spark中多表連接的效率。其中,改進(jìn)的broadcasthashjoin操作,增加了小表中key值被大表查找的先驗(yàn)概率,小表中每個(gè)key均對(duì)應(yīng)一個(gè)先驗(yàn)被查找概率。在利用小表數(shù)據(jù)構(gòu)建哈希表時(shí)首先按照該先驗(yàn)概率對(duì)key從小到大進(jìn)行排序,排序后得到一個(gè)新的有序表,然后再對(duì)新的有序表進(jìn)行常規(guī)的哈希表構(gòu)建過(guò)程。由于用于構(gòu)建哈希表的小表中每個(gè)key被查找的概率不同,按被查找的先驗(yàn)概率大小來(lái)決定其沖突處理時(shí)的位置,將出現(xiàn)概率大的放在所需比較次數(shù)少的位置,從而減少后續(xù)大表查找連接操作時(shí)的查找次數(shù),提高broadcasthashjoin的整體性能。
例如,在小表中存在key(b)鍵和key(c)鍵,且二者的對(duì)應(yīng)的哈希地址相等即h(key(b))=h(key(c)),在小表中key(b)位于key(c)之前,但key(b)的被查找的概率要遠(yuǎn)小于key(c)。本方法首先按照先驗(yàn)概率大小排序得到新表,排序后key(c)在新表中的位置要位于key(b)之前。然后按新表創(chuàng)建哈希表,此時(shí)在h(key(b))(或h(key(c)))位置對(duì)應(yīng)的鏈表中key(c)位于key(b)之前。最后獲取大表內(nèi)容在哈希表中進(jìn)行查找并連接,此時(shí)key(c)的查找長(zhǎng)度減少而key(b)的查找長(zhǎng)度增加,但由于在大表中key(c)出現(xiàn)的概率要遠(yuǎn)大于key(b),所以整體查找效率提高。對(duì)于該簡(jiǎn)例,改進(jìn)前后key(b)與key(c)在哈希表中的位置如圖4所示,圖4中箭頭左邊的圖為改進(jìn)前的哈希表,箭頭右邊改進(jìn)后的哈希表。
綜上所述,本方法將數(shù)據(jù)元素被查找的先驗(yàn)概率作為建立哈希表時(shí)插入順序的依據(jù),查找過(guò)程與原哈希表相比在不增加其它過(guò)多消耗的同時(shí)降低了沖突時(shí)執(zhí)行查詢的查找長(zhǎng)度,從而使查詢響應(yīng)時(shí)間更短,join的連接效率更高。
以上對(duì)本發(fā)明所提供的一種sparkbroadcasthashjoin操作的改進(jìn)方法進(jìn)行了詳細(xì)介紹。本文中應(yīng)用了具體個(gè)例對(duì)本發(fā)明的原理及實(shí)施方式進(jìn)行了闡述,以上實(shí)施例的說(shuō)明只是用于幫助理解本發(fā)明的方法及其核心思想。應(yīng)當(dāng)指出,對(duì)于本技術(shù)領(lǐng)域的普通技術(shù)人員來(lái)說(shuō),在不脫離本發(fā)明原理的前提下,還可以對(duì)本發(fā)明進(jìn)行若干改進(jìn)和修飾,這些改進(jìn)和修飾也落入本發(fā)明權(quán)利要求的保護(hù)范圍內(nèi)。