亚洲狠狠干,亚洲国产福利精品一区二区,国产八区,激情文学亚洲色图

在Hive中連接運算的轉(zhuǎn)化方法及裝置與流程

文檔序號:11386713閱讀:263來源:國知局
在Hive中連接運算的轉(zhuǎn)化方法及裝置與流程

技術(shù)領域
】本發(fā)明涉及數(shù)據(jù)處理領域,具體涉及一種在hive中連接運算的轉(zhuǎn)化方法及裝置。
背景技術(shù)
:結(jié)構(gòu)化查詢語言(structuredquerylanguage)簡稱sql,是一種數(shù)據(jù)庫查詢和程序設計語言,用于存取數(shù)據(jù)以及查詢、更新和管理數(shù)據(jù)庫系統(tǒng)。在數(shù)據(jù)庫查詢中,往往涉及join運算,join是sql中的連接查詢,連接查詢是數(shù)據(jù)庫中最主要的查詢之一,連接查詢包括內(nèi)連接、外連接和交叉連接等,通過連接運算符可以實現(xiàn)多個表查詢。在大數(shù)據(jù)時代,在進行大數(shù)據(jù)計算時,基于hadoop(一個由apache基金會所開發(fā)的分布式系統(tǒng)基礎架構(gòu))的數(shù)據(jù)倉庫工具hive將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張張數(shù)據(jù)庫表,并將sql語句轉(zhuǎn)化為任務在hadoop上運行;在大數(shù)據(jù)計算時,涉及大量的連接查詢,但由于連接運算的效率比較低,尤其隨著數(shù)據(jù)量的增長,連接運算的效率更是越來越低,無法滿足數(shù)據(jù)量巨大的大數(shù)據(jù)運算所需的高效率要求。技術(shù)實現(xiàn)要素:本發(fā)明的目的在于提供一種在hive中連接運算的轉(zhuǎn)化方法及裝置,將進行數(shù)據(jù)庫操作時的連接運算轉(zhuǎn)化為非連接運算,以此提高數(shù)據(jù)庫查詢效率。為實現(xiàn)該目的,本發(fā)明采用如下技術(shù)方案:第一方面,本發(fā)明的一個實施例提供了一種在hive中連接運算的轉(zhuǎn)化方法,包括如下步驟:在需要對第一表與第二表的連接運算進行轉(zhuǎn)化時,判斷所述連接運算的關(guān)聯(lián)字段是否為其中一個表的主鍵字段;當所述關(guān)聯(lián)字段為其中一個表的主鍵字段時,從已聯(lián)合所有第一表與第二表的字段記錄中對預設字段作分析函數(shù)運算,以獲取對應的中間表字段記錄;依據(jù)第一表與第二表的連接運算類型及原連接運算的連接條件設定相應的查詢條件,從所述中間表字段記錄獲取第一表與第二表的連接運算結(jié)果。進一步的,所述方法還包括,當所述關(guān)聯(lián)字段同為兩個表的主鍵字段時,從已聯(lián)合所有第一表與第二表的字段記錄中對預設字段作聚合函數(shù)運算,以獲取對應的中間表字段記錄。具體的,所述連接運算類型包括內(nèi)連接及外連接,所述外連接包括左外連接和右外連接。具體的,當所述關(guān)聯(lián)字段為其中一表的主鍵字段且所述連接運算類型為內(nèi)連接時,所述從已聯(lián)合所有第一表與第二表的字段記錄中對預設字段作分析函數(shù)運算,以獲取對應的中間表字段記錄的步驟,包括:聯(lián)合所有為第一表與第二表添加標志位字段后的所有字段記錄,所述預設字段包括第二表的非主鍵字段及所述標志位字段;根據(jù)連接條件選取預設的分析函數(shù)對第二表的非主鍵字段作分析函數(shù)運算得到第一字段記錄、以及對所述標志位字段作分析函數(shù)運算得到第二字段記錄;輸出包含第一字段記錄和第二字段記錄的中間表字段記錄;當所述關(guān)聯(lián)字段為其中一個表的主鍵字段且所述連接運算類型為外連接時,定義左外連接的左表為主表及右表為副表,或右外連接的右表為主表及左表為副表,所述從已聯(lián)合所有第一表與第二表的字段記錄中對預設字段作分析函數(shù)運算以獲取對應的中間表字段記錄的步驟,包括:聯(lián)合所有為主表與副表添加標志位字段后的所有字段記錄,所述預設字段包括副表的非主鍵字段;根據(jù)連接條件選取預設的分析函數(shù)對副表的非主鍵字段作分析函數(shù)運算得到第三字段記錄;輸出包含第三字段記錄的中間表字段記錄。具體的,當所述關(guān)聯(lián)字段同為兩個表的主鍵字段且所述連接運算類型為內(nèi)連接時,所述從已聯(lián)合所有第一表與第二表的字段記錄中對預設字段作聚合函數(shù)運算以獲取中間表字段記錄的步驟,包括:聯(lián)合所有為第一表與第二表添加標志位字段后的所有字段記錄,所述預設字段包括第一表與第二表的非主鍵字段;根據(jù)所述關(guān)聯(lián)字段對聯(lián)合所有的結(jié)果記錄進行分組;對分組后的非主鍵字段作聚合函數(shù)運算得到對應的非主鍵字段記錄;輸出包含所述對應的非主鍵字段記錄的中間表字段記錄;當所述關(guān)聯(lián)字段同為兩個表的主鍵字段且所述連接運算類型為外連接時,定義左外連接的左表為主表及右表為副表、或右外連接的右表為主表及左表為副表,所述從已聯(lián)合所有第一表與第二表的字段記錄中對預設字段作聚合函數(shù)運算以獲取對應的中間表字段記錄的步驟,包括:聯(lián)合所有為主表與副表添加標志位字段后的所有字段記錄,所述預設字段包括副表的非主鍵字段及所述標志位字段;根據(jù)所述關(guān)聯(lián)字段對聯(lián)合所有的結(jié)果記錄進行分組;對分組后的副表的非主鍵字段作聚合函數(shù)運算得到第四字段記錄及對標識為字段作聚合函數(shù)運算得到第五標志位字段記錄;輸出包含第四字段記錄及第五標志位字段記錄的中間表字段記錄。更進一步的,在聯(lián)合所有第一表與第二表的字段記錄時,對于存在于第一表而不存在于第二表、和存在于第二表而不存在于第一標的字段記錄以null表示。具體的,所述標志位字段用于表征字段記錄的來源表。進一步的,所述方法還包括步驟:根據(jù)所述第一表與第二表的連接運算結(jié)果選取所需查詢的字段記錄。更進一步的,所述方法還包括步驟:將所述選取的字段記錄作為新表的字段記錄以供與第三表做連接運算及連接運算的轉(zhuǎn)化。第二方面,本發(fā)明的另一個實施例中提供了一種在hive中連接運算的轉(zhuǎn)化裝置,其在計算機上運行,包括:判斷模塊:用于在需要對第一表與第二表的連接運算進行轉(zhuǎn)化時,判斷所述連接運算的關(guān)聯(lián)字段是否為其中一個表的主鍵字段;獲取模塊:用于當所述關(guān)聯(lián)字段為其中一個表的主鍵字段時,從已聯(lián)合所有第一表與第二表的字段記錄中對預設字段作分析函數(shù)運算,以獲取對應的中間表字段記錄;輸出模塊:用于依據(jù)第一表與第二表的連接運算類型及原連接運算的連接條件設定相應的查詢條件,從所述中間表字段記錄獲取第一表與第二表的連接運算結(jié)果。與現(xiàn)有技術(shù)相比,本發(fā)明具備如下優(yōu)點:本發(fā)明的一個實施例中,針對在大數(shù)據(jù)中面臨所處理的數(shù)據(jù)量越來越大,計算難度越來越大,計算效率要求越來越高的問題,提出了一種在hive中連接運算的轉(zhuǎn)化方法。在判斷連接運算的兩個表的關(guān)聯(lián)字段為其中一個表的主鍵字段的條件下,利用聯(lián)合所有運算及分析函數(shù)巧妙地將連接運算轉(zhuǎn)化為非連接運算,以此規(guī)避數(shù)據(jù)處理中常用的連接運算,避免作連接運算的兩個表數(shù)據(jù)量巨大而導致連接效率低下或幾乎無法運算的問題,提高數(shù)據(jù)庫的查詢效率,降低終端運算壓力。同時,在連接運算的兩個表的關(guān)聯(lián)字段同為兩個表的主鍵字段的條件下,利用聯(lián)合所有運算及聚合函數(shù)巧妙地將連接運算轉(zhuǎn)化為非連接運算,同樣以此規(guī)避連接運算,提高數(shù)據(jù)庫查詢效率。顯然,上述有關(guān)本發(fā)明優(yōu)點的描述是概括性的,更多的優(yōu)點描述將體現(xiàn)在后續(xù)的實施例揭示中,以及,本領域技術(shù)人員也可以本發(fā)明所揭示的內(nèi)容合理地發(fā)現(xiàn)本發(fā)明的其他諸多優(yōu)點。本發(fā)明附加的方面和優(yōu)點將在下面的描述中部分給出,這些將從下面的描述中變得明顯,或通過本發(fā)明的實踐了解到。【附圖說明】圖1為本發(fā)明在hive中連接運算的轉(zhuǎn)化方法的一種實施例的流程示意圖;圖2為本發(fā)明基于關(guān)聯(lián)字段為其中一個表的主鍵字段的一種實施例的流程示意圖;圖3為本發(fā)明基于關(guān)聯(lián)字段為其中一個表的主鍵字段的另一種實施例的流程示意圖;圖4為本發(fā)明在hive中連接運算的轉(zhuǎn)化方法的另一實施例的流程示意圖;圖5為本發(fā)明基于關(guān)聯(lián)字段同為兩個表的主鍵字段的一種實施例的流程示意圖;圖6為本發(fā)明基于關(guān)聯(lián)字段同為兩個表的主鍵字段的另一種實施例的流程示意圖;圖7是本發(fā)明hive中連接運算的轉(zhuǎn)化裝置的一種實施例的模塊化示意圖?!揪唧w實施方式】下面詳細描述本發(fā)明的實施例,所述實施例的示例在附圖中示出,其中自始至終相同或類似的標號表示相同或類似的元件或具有相同或類似功能的元件。下面通過參考附圖描述的實施例是示例性的,僅用于解釋本發(fā)明,而不能解釋為對本發(fā)明的限制。本
技術(shù)領域
技術(shù)人員可以理解,除非另外定義,這里使用的所有術(shù)語(包括技術(shù)術(shù)語和科學術(shù)語),具有與本發(fā)明所屬領域中的普通技術(shù)人員的一般理解相同的意義。還應該理解的是,諸如通用字典中定義的那些術(shù)語,應該被理解為具有與現(xiàn)有技術(shù)的上下文中的意義一致的意義,并且除非像這里一樣被特定定義,否則不會用理想化或過于正式的含義來解釋。需要說明的是,本發(fā)明的一個實施例中提出了一種在hive中連接運算的轉(zhuǎn)化方法,可以通過編程將該方法實現(xiàn)為計算機程序在終端設備上實現(xiàn),所述終端設備包括但不限于計算機、網(wǎng)絡主機、單個網(wǎng)絡服務器、多個網(wǎng)絡服務器集或多個服務器構(gòu)成的云。第一方面,如圖1所示是本發(fā)明的一個實施例中在hive中連接運算的轉(zhuǎn)化方法的流程示意圖,包括步驟s100-s300。步驟s100:在需要對第一表與第二表的連接運算進行轉(zhuǎn)化時,判斷所述連接運算的關(guān)聯(lián)字段是否為其中一個表的主鍵字段。在數(shù)據(jù)庫管理系統(tǒng)中,當檢索數(shù)據(jù)需要對存放在多個表中的不同實體的信息進行查詢時,需要通過連接運算實現(xiàn)多個表的連接查詢,連接查詢是數(shù)據(jù)庫管理系統(tǒng)中最主要的查詢之一,連接運算的類型主要包括內(nèi)連接、外連接及交叉連接。在本發(fā)明實施例中,在需要對兩個表進行連接運算以實現(xiàn)兩個表的連接查詢時將所述連接運算轉(zhuǎn)化為非連接運算,以此提高數(shù)據(jù)庫查詢效率。具體的,在本方案的一個實施例中首先判斷第一表與第二表的連接運算的關(guān)聯(lián)字段是否為其中一個表的主鍵字段,所述關(guān)聯(lián)字段是連接查詢中表中含義相同的字段,在連接運算時根據(jù)關(guān)聯(lián)字段之間的運算關(guān)系構(gòu)成連接條件以實現(xiàn)兩個表的連接運算。在本實施例中關(guān)聯(lián)字段也即為第一表與第二表中含義相同的字段;所述主鍵字段是表中的一個或多個字段,主鍵字段的值用于唯一地標識表中的一條記錄。步驟s200:當所述連接運算的關(guān)聯(lián)字段為其中一個表的主鍵字段時,從已聯(lián)合所有第一表與第二表的字段記錄中對預設字段作分析函數(shù)運算以獲取中間表字段記錄。步驟s300:根據(jù)第一表與第二表的連接運算類型及連接條件,設定相應的查詢條件從所述中間表字段記錄獲取第一表與第二表的連接運算結(jié)果。當連接運算的關(guān)聯(lián)字段為第一表或第二表的主鍵字段時,首先對第一表和第二表的字段作聯(lián)合所有運算得到聯(lián)合所有運算結(jié)果,然后對聯(lián)合所有運算結(jié)果中的預設字段作分析函數(shù)運算,所述預設字段包括第一表或第二表的主鍵字段、非主鍵字段或下述的標志位字段,以此可以獲得包含關(guān)聯(lián)字段、第一表的非主鍵字段、第二表的非主鍵字段及對預設字段做分析函數(shù)運算后的中間表字段記錄。然后,根據(jù)第一表與第二表的連接運算類型及原連接運算的連接條件設定相應的查詢條件以從所述中間表字段記錄中獲取第一表與第二表的連接運算結(jié)果,至此將第一表與第二表的連接運算轉(zhuǎn)化為非連接運算,不再需要直接對第一表與第二表進行連接運算,避免連接運算效率低下的問題,提高數(shù)據(jù)庫查詢效率,降低終端運算壓力;最后再根據(jù)所述第一表與第二表的連接運算結(jié)果選取所需查詢的字段記錄。本發(fā)明的一個實施例中,所述連接運算類型包括內(nèi)連接(join/innerjoin)和外連接,所述外連接包括左外連接(leftjoin)及右外連接(rightjoin)。表1-1表示關(guān)聯(lián)字段為其中一個表的主鍵字段的示意性實施例,并示出了表dw_a、表dw_b的表結(jié)構(gòu),表dw_b、dw_a分別為本發(fā)明實施例所述的第一表和第二表。其中,表dw_a與表dw_b的關(guān)聯(lián)字段為key_1、key_2,并且,key_1、key_2是表dw_a的主鍵字段。表1-1dw_a與dw_b的表結(jié)構(gòu)如表1-2所示是表dw_a、表dw_b的字段記錄。表dw_a的字段記錄如下:key_1key_2col_a_1011102113024表dw_b的字段記錄如下:key_1key_2col_b_1col_b_20132102120132133表1-2dw_a與dw_b的表記錄如圖2所示是本發(fā)明基于關(guān)聯(lián)字段為其中一個表的主鍵字段的一種實施例,當所述關(guān)聯(lián)字段為其中一個表的主鍵字段且所述連接運算類型為內(nèi)連接時,步驟s200包括步驟s210-s212:步驟s210:聯(lián)合所有為第一表與第二表添加標志位字段后的所有字段記錄;步驟s211:根據(jù)連接條件選取預設的分析函數(shù)對第二表的非主鍵字段作分析函數(shù)運算得到第一字段記錄、以及對所述標志位字段作分析函數(shù)運算得到第二字段記錄;步驟s212:輸出包含第一字段記錄和第二字段記錄的中間表字段記錄;步驟s300:依據(jù)第一表與第二表的連接運算類型及原連接運算的連接條件設定相應的查詢條件,從所述中間表字段記錄獲取第一表與第二表的連接運算結(jié)果。其中,在聯(lián)合所有第一表與第二表的所有字段記錄時,對于存在于第一表而不存在于第二表、和存在于第二表而不存在于第一標的字段記錄以null表示,并且利用所述標志位字段表征字段記錄的來源表,最后再根據(jù)所述第一表與第二表的連接運算結(jié)果選取所需查詢的字段記錄。例如,現(xiàn)需要將表dw_b、表dw_a中具有相同關(guān)聯(lián)字段的記錄關(guān)聯(lián)起來。利用現(xiàn)有的內(nèi)連接運算的算法如下:selectkey_1,key_2,a.col_a_1,b.col_b_1,b.col_b_2fromdw_bbjoindw_aaona.key_1=b.key_1anda.key_2=b.key_2;根據(jù)本實施例方案將所述內(nèi)連接運算進行轉(zhuǎn)化,轉(zhuǎn)化后的算法如下:其中,首先為表dw_b與表dw_a添加標志位字段flag,并定義表dw_a的標志位字段記錄為1,表dw_b的標志位字段記錄為0,然后聯(lián)合所有為第一表與第二表添加標志位字段后的所有字段記錄,即unionall所對應的2個select語句;由于連接條件為a.key_1=b.key_1anda.key_1=b.key_2,即表dw_b與表dw_a中具有相同key_1、key_1的記錄,因此所述預設字段即為第二表的非主鍵字段及所述標志位字段,因此選取分析函數(shù)max(x)over(partitionbykey_1,key_2)x對表dw_a的非主鍵字段col_a_1作分析函數(shù)運算,該分析函數(shù)是將與本行的key_1、key_2相同的記錄的col_a_1字段匯總在一起再進行聚合函數(shù)max運算,如此便從表dw_a中獲取了字段col_a_1作為第一字段記錄,同樣地,對所述標志位字段作分析函數(shù)運算得到第二字段記錄以用于表明字段記錄存在于表dw_a;然后輸出一個虛擬的中間表,其包含了所述第一字段記錄及第二字段記錄;最后設定表征記錄存在于表dw_b且“key_1、key_2”存在于表dw_a的查詢條件“whereflag=0andaflag=1”從所述中間表記錄獲取表dw_b與表dw_a的內(nèi)連接運算結(jié)果;最后select出所需的字段記錄即可。本實施例所輸出的結(jié)果為:key_1key_2col_a_1col_b_1col_b_20113210221如圖3所示是本發(fā)明基于關(guān)聯(lián)字段為其中一個表的主鍵字段的另一種實施例,當所述關(guān)聯(lián)字段為其中一個表的主鍵字段且所述連接運算類型為外連接時,定義左外連接的左表為主表、右外連接的右表為主表,如dw_aleftjoindw_b,表dw_a即為主表,dw_arightjoindw_b,表dw_b即為主表,相應的,另一個表即為副表,在本實施例中,步驟s200包括步驟s220-s223:步驟s220:聯(lián)合所有為主表與副表添加標志位字段后的所有字段記錄;步驟s221:根據(jù)連接條件選取預設的分析函數(shù)對副表的非主鍵字段作分析函數(shù)運算得到第三字段記錄;步驟s222:輸出包含第三字段記錄的中間表字段記錄;步驟s300:依據(jù)第一表與第二表的連接運算類型及原連接運算的連接條件設定相應的查詢條件,從所述中間表字段記錄獲取第一表與第二表的連接運算結(jié)果。同樣的,在聯(lián)合所有第一表與第二表的所有字段記錄時,對于存在于第一表而不存在于第二表和存在于第二表而不存在于第一標的字段記錄以null表示,并且利用所述標志位字段表征字段記錄的來源表,最后再根據(jù)所述第一表與第二表的連接運算結(jié)果選取所需查詢的字段記錄。例如,現(xiàn)需要將表dw_b的col_b_1、col_b_2同表dw_a的col_a_1關(guān)聯(lián)起來并保留表dw_b的字段記錄。利用現(xiàn)有的外連接運算的算法如下:selectb.key_1,b.key_2,a.col_a_1,b.col_b_1,b.col_b_2fromdw_bbleftjoindw_aaona.key_1=b.key_1anda.key_2=b.key_2;根據(jù)本實施例方案將所述外連接運算進行轉(zhuǎn)化,轉(zhuǎn)化后的算法如下:其中,為表dw_b與表dw_a添加標志位字段flag,并定義表dw_a的標志位字段記錄為1,表dw_b的標志位字段記錄為0,然后聯(lián)合所有為第一表與第二表添加標志位字段后的所有字段記錄,即unionall所對應的2個select語句;由于連接條件為a.key_1=b.key_1anda.key_1=b.key_2,即表dw_b與表dw_a中具有相同key_1、key_1的記錄,所述預設字段為副表的非主鍵字段,因此選取分析函數(shù)max(x)over(partitionbykey_1,key_2)x對表dw_a的非主鍵字段col_a_1作分析函數(shù)運算,該分析函數(shù)是將與本行的key_1、key_2相同的記錄的col_a_1字段匯總在一起再進行聚合函數(shù)max運算,如此便從表dw_a中獲取了字段col_a_1作為第三字段記錄;然后輸出一個虛擬的中間表,其包含了所述第三字段記錄;最后設定表征記錄來源于主表的查詢條件“whereflag=0”從所述中間表記錄獲取表dw_b與表dw_a的外連接運算結(jié)果;最后select出所需的字段記錄即可。本實施例所輸出的結(jié)果為:key_1key_2col_a_1col_b_1col_b_2011321022120null1321null33本發(fā)明還包括關(guān)聯(lián)字段同為兩個表的主鍵字段的情況,當所述關(guān)聯(lián)字段同為兩個表的主鍵字段時,本發(fā)明實施例的流程示意圖如圖4所示,包括如下步驟:步驟s100:在需要對第一表與第二表的連接運算進行轉(zhuǎn)化時,判斷所述連接運算的關(guān)聯(lián)字段是否為其中一個表的主鍵字段;步驟s2000:當所述關(guān)聯(lián)字段同為兩個表的主鍵字段時,從已聯(lián)合所有第一表與第二表的字段記錄中對預設字段作聚合函數(shù)運算,以獲取對應的中間表字段記錄;步驟s300:依據(jù)第一表與第二表的連接運算類型及原連接運算的連接條件設定相應的查詢條件,從所述中間表字段記錄獲取第一表與第二表的連接運算結(jié)果。同樣的,本發(fā)明實施例中,所述連接運算的類型包括內(nèi)連接(join/innerjoin)和外連接,所述外連接包括左外連接(leftjoin)及右外連接(rightjoin)。所述預設字段包括第一表或第二表的主鍵字段、非主鍵字段或下述的標志位字段。表1-3表示關(guān)聯(lián)字段同為兩個表的主鍵字段的示意性實施例,并示出了表dw_a、表dw_b的表結(jié)構(gòu),表dw_a、dw_b分別為本發(fā)明實施例所述的第一表和第二表。其中,表dw_a與表dw_b的關(guān)聯(lián)字段為key_1、key_2,并且,key_1、key_2同為表dw_a與表dw_b的主鍵字段。表1-3dw_a與dw_b的表結(jié)構(gòu)如表1-4所示是表dw_a、表dw_b的字段記錄。表dw_a的字段記錄如下:表dw_b的字段記錄如下:key_1key_2col_b_1col_b_20132102120132133表1-4dw_a與dw_b的表記錄如圖5所示是本發(fā)明基于關(guān)聯(lián)字段同為兩個表的主鍵字段的一種實施例,當所述關(guān)聯(lián)字段同為兩個表的主鍵字段且所述連接運算類型為內(nèi)連接時,步驟s2000包括步驟s2010-s2013。步驟s2010:聯(lián)合所有為第一表與第二表添加標志位字段后的所有字段記錄;步驟s2011:根據(jù)所述關(guān)聯(lián)字段對聯(lián)合所有的結(jié)果記錄進行分組;步驟s2012:對分組后的非主鍵字段作聚合函數(shù)運算得到對應的非主鍵字段記錄;步驟s2013:輸出包含所述對應的非主鍵字段記錄的中間表字段記錄;步驟s300:依據(jù)第一表與第二表的連接運算類型及原連接運算的連接條件設定相應的查詢條件,從所述中間表字段記錄獲取第一表與第二表的連接運算結(jié)果。其中,在聯(lián)合所有第一表與第二表的所有字段記錄時,對于存在于第一表而不存在于第二表和存在于第二表而不存在于第一標的字段記錄以null表示,并且利用所述標志位字段表征字段記錄的來源表,最后再根據(jù)所述第一表與第二表的連接運算結(jié)果選取所需查詢的字段記錄。例如,現(xiàn)需要將表dw_a的col_a_1同表dw_b的col_b_1、col_b_2關(guān)聯(lián)起來。利用現(xiàn)有的內(nèi)連接運算的算法如下:selecta.key_1,a.key_2,a.col_a_1,b.col_b_1,b.col_b_2fromdw_aajoindw_bbona.key_1=b.key_1anda.key_2=b.key_2;根據(jù)本實施例方案將所述內(nèi)連接運算進行轉(zhuǎn)化,轉(zhuǎn)化后的算法如下:由于所需的字段記錄的關(guān)聯(lián)字段同時需存在于表dw_a與表dw_b,故不需要為表dw_a與表dw_b添加標志位字段,或說表dw_a與表dw_b的標志位字段記錄相同,然后聯(lián)合所有表dw_a與表dw_b的字段記錄,即unionall所對應的2個select語句;然后根據(jù)所述關(guān)聯(lián)字段對聯(lián)合所有的結(jié)果記錄進行分組,即groupbykey_1,key_2,本實施例中所述預設字段即為第一表與第二表非主鍵字段,然后對分組后的非主鍵字段作聚合函數(shù)運算以從分組后的記錄中選取非主鍵記錄不為null的記錄,在此利用聚合函數(shù)max(x)即可選取,接著輸出包含所述對應的非主鍵字段記錄的中間表字段記錄;接著設定表征非主鍵字段不為空的查詢條件“wherecol_a_1isnotnullandcol_b_1isnotnullandcol_b_2isnotnull”從所述中間表記錄獲取表dw_a與表dw_b的內(nèi)連接運算結(jié)果;最后select出所需的字段記錄即可。本實施例所輸出的結(jié)果為:key_1key_2col_a_1col_b_1col_b_20113210221如圖6所示是基于關(guān)聯(lián)字段同為兩個表的主鍵字段的一種實施例,當所述關(guān)聯(lián)字段同為兩個表的主鍵字段且所述連接運算類型為外連接時,定義左外連接的左表為主表、右外連接的右表為主表,如dw_aleftjoindw_b,表dw_a即為主表,dw_arightjoindw_b,表dw_b即為主表,相應的,另一個表即為副表,在本實施例中,步驟s2000包括步驟s2020-s2023。步驟s2020:聯(lián)合所有為主表與副表添加標志位字段后的所有字段記錄;步驟s2021:根據(jù)所述關(guān)聯(lián)字段對聯(lián)合所有的結(jié)果記錄進行分組;步驟s2022:對分組后的副表的非主鍵字段作聚合函數(shù)運算得到第四字段記錄及對標識為字段作聚合函數(shù)運算得到第五標志位字段記錄;步驟s2023:輸出包含第四字段記錄及第五標志位字段記錄的中間表字段記錄;步驟s300:依據(jù)第一表與第二表的連接運算類型及原連接運算的連接條件設定相應的查詢條件,從所述中間表字段記錄獲取第一表與第二表的連接運算結(jié)果。同樣的,在聯(lián)合所有第一表與第二表的所有字段記錄時,對于存在于第一表而不存在于第二表和存在于第二表而不存在于第一標的字段記錄以null表示,并且利用所述標志位字段表征字段記錄的來源表,最后再根據(jù)所述第一表與第二表的連接運算結(jié)果選取所需查詢的字段記錄。例如,現(xiàn)需要列出存在于表dw_a不存在于表dw_b的主鍵的記錄。利用現(xiàn)有技術(shù)的外連接運算的算法如下:selecta.key_1,a.key_2,a.col_a_1fromdw_aaleftjoindw_bbona.key_1=b.key_1anda.key_2=b.key_2;根據(jù)本實施例方案將所述外連接運算進行轉(zhuǎn)化,轉(zhuǎn)化后的算法如下:其中,為表dw_b與表dw_a添加標志位字段flag,并定義表dw_a的標志位字段記錄為1,表dw_b的標志位字段記錄為0,然后聯(lián)合所有為第一表與第二表添加標志位字段后的所有字段記錄,即unionall所對應的2個select語句;然后根據(jù)所述關(guān)聯(lián)字段對聯(lián)合所有的結(jié)果記錄進行分組,即groupbykey_1,key_2,本實施例中預設字段為副表的非主鍵和標識位字段,再對分組后的副表的非主鍵字段作聚合函數(shù)運算得到第四字段記錄及對標識位字段作聚合函數(shù)運算得到第五標志位字段記錄,在此利用聚合函數(shù)max(x)即可選取,接著輸出包含所述對應的非主鍵字段記錄的中間表字段記錄;接著設定表征記錄來源于主表的查詢條件“whereflag=1”從所述中間表記錄獲取表dw_a與表dw_b的外連接運算結(jié)果;最后select出所需的字段記錄即可。本實施例所輸出的結(jié)果為:key_1key_2col_a_1col_b_1col_b_20113210221111nullnull024nullnull可以理解的是,在上述選取了所需查詢的字段記錄后,可以將該些記錄作為新表的字段記錄,以供該新表與第三表作連接運算,并利用本發(fā)明實施例方案將連接運算進行轉(zhuǎn)化,以此實現(xiàn)多個表的連接查詢。終上所述,本發(fā)明的一個實施例中,針對在大數(shù)據(jù)中面臨所處理的數(shù)據(jù)量越來越大,計算難度越來越大,計算效率要求越來越高的問題,提出了一種在hive中連接運算的轉(zhuǎn)化方法。在判斷連接運算的兩個表的關(guān)聯(lián)字段為其中一個表的主鍵字段的條件下,利用聯(lián)合所有運算及分析函數(shù)巧妙地將連接運算轉(zhuǎn)化為非連接運算,以此規(guī)避數(shù)據(jù)處理中常用的連接運算,避免作連接運算的兩個表數(shù)據(jù)量巨大而導致連接效率低下或幾乎無法運算的問題,提高數(shù)據(jù)庫的查詢效率,降低終端運算壓力。同時,在連接運算的兩個表的關(guān)聯(lián)字段同為兩個表的主鍵字段的條件下,利用聯(lián)合所有運算及聚合函數(shù)巧妙地將連接運算轉(zhuǎn)化為非連接運算,同樣以此規(guī)避連接運算,提高數(shù)據(jù)庫查詢效率。進一步的,依據(jù)計算機軟件的功能模塊化思維,基于前述的一種在hive中連接運算的轉(zhuǎn)化方法,本發(fā)明還提供一種在hive中連接運算的轉(zhuǎn)化裝置。具體請參閱圖7,該轉(zhuǎn)化裝置包括:判斷模塊100:用于在需要對第一表與第二表的連接運算進行轉(zhuǎn)化時,判斷所述連接運算的關(guān)聯(lián)字段是否為其中一個表的主鍵字段;獲取模塊200:用于當所述關(guān)聯(lián)字段為其中一個表的主鍵字段時,從已聯(lián)合所有第一表與第二表的字段記錄中對預設字段作分析函數(shù)運算,以獲取對應的中間表字段記錄;輸出模塊300:用于依據(jù)第一表與第二表的連接運算類型及原連接運算的連接條件設定相應的查詢條件,從所述中間表字段記錄獲取第一表與第二表的連接運算結(jié)果。在本發(fā)明的一個實施例中,在需要對兩個表進行連接運算以實現(xiàn)兩個表的連接查詢時將所述連接運算轉(zhuǎn)化為非連接運算,以此提高數(shù)據(jù)庫查詢效率,首先判斷模塊100判斷第一表與第二表的連接運算的關(guān)聯(lián)字段是否為其中一個表的主鍵字段,所述關(guān)聯(lián)字段是連接查詢中表中含義相同的字段,在連接運算時根據(jù)關(guān)聯(lián)字段之間的運算關(guān)系構(gòu)成連接條件以實現(xiàn)兩個表的連接運算。在本實施例中關(guān)聯(lián)字段也即為第一表與第二表中含義相同的字段;所述主鍵字段是表中的一個或多個字段,主鍵字段的值用于唯一地標識表中的一條記錄。在本發(fā)明的一個實施例中,當所述關(guān)聯(lián)字段為第一表或第二表的主鍵字段時,獲取模塊200首先對第一表和第二表的字段作聯(lián)合所有運算得到聯(lián)合所有運算結(jié)果,然后對聯(lián)合所有運算結(jié)果中的預設字段作分析函數(shù)運算,所述預設字段包括第一表或第二表的主鍵字段、非主鍵字段或上述的標志位字段,以此可以獲得包含關(guān)聯(lián)字段、第一表的非主鍵字段、第二表的非主鍵字段及對預設字段做分析函數(shù)運算后的中間表字段記錄。然后,輸出模塊300根據(jù)第一表與第二表的連接運算類型及連接條件設定相應的查詢條件以從所述中間表字段記錄中獲取第一表與第二表的連接運算結(jié)果,至此將第一表與第二表的連接運算轉(zhuǎn)化為非連接運算,不再需要直接對第一表與第二表進行連接運算,避免連接運算所不可避免的查詢效率低下的問題,提高數(shù)據(jù)庫查詢效率,降低終端運算壓力。最后再根據(jù)所述第一表與第二表的連接運算結(jié)果選取所需查詢的字段記錄。本發(fā)明針對在大數(shù)據(jù)中面臨所處理的數(shù)據(jù)量越來越大,計算難度越來越大,計算效率要求越來越高的問題,提出了一種在hive中連接運算的轉(zhuǎn)化方法。在判斷連接運算的兩個表的關(guān)聯(lián)字段為其中一個表的主鍵字段的條件下,利用聯(lián)合所有運算及分析函數(shù)巧妙地將連接運算轉(zhuǎn)化為非連接運算,以此規(guī)避數(shù)據(jù)處理中常用的連接運算,避免作連接運算的兩個表數(shù)據(jù)量巨大而導致連接效率低下或幾乎無法運算的問題,提高數(shù)據(jù)庫的查詢效率,降低終端運算壓力。雖然上面已經(jīng)示出了本發(fā)明的一些示例性實施例,但是本領域的技術(shù)人員將理解,在不脫離本發(fā)明的原理或精神的情況下,可以對這些示例性實施例做出改變,本發(fā)明的范圍由權(quán)利要求及其等同物限定。當前第1頁12
當前第1頁1 2 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1