壓縮處理,以最大化的減少所占用的存儲(chǔ)空間。
[0102]例如,該列式存儲(chǔ)文件可以為ORC文件,每個(gè)ORC文件由多個(gè)stripes組成,其中,stripes由一個(gè)輕量級(jí)的索引、列數(shù)據(jù)以及stripe腳本組成,索引默認(rèn)存儲(chǔ)了預(yù)設(shè)數(shù)量行數(shù)據(jù)中列的最大值和最小值,以用于在數(shù)據(jù)的查詢過(guò)程中準(zhǔn)確定位數(shù)據(jù)的查詢范圍,從而節(jié)省大量的輸入和輸出操作。
[0103]進(jìn)一步的,還將對(duì)存入的原始數(shù)據(jù)根據(jù)提取的原始數(shù)據(jù)進(jìn)行排序,以進(jìn)一步加快數(shù)據(jù)的查詢速度。
[0104]在實(shí)際運(yùn)營(yíng)過(guò)程中,將保留兩份數(shù)據(jù)文件,并置于兩臺(tái)不同的機(jī)器中,以確保集群中任何一臺(tái)機(jī)器損壞后可以自動(dòng)恢復(fù),同是也提高了處理的并發(fā)性。
[0105]如圖5所示,在一個(gè)實(shí)施例中,一種實(shí)現(xiàn)數(shù)據(jù)查詢的系統(tǒng),包括請(qǐng)求獲取模塊110、定位模塊130和輸出模塊150。
[0106]請(qǐng)求獲取模塊110,用于獲取查詢請(qǐng)求。
[0107]本實(shí)施例中,請(qǐng)求獲取模塊110將提供可視化接口,以獲取用戶所觸發(fā)的查詢請(qǐng)求,例如,用戶可通過(guò)以JDBC/0DBC標(biāo)準(zhǔn)的java數(shù)據(jù)庫(kù)控件和網(wǎng)頁(yè)界面等形式存在的數(shù)據(jù)的查詢界面輸入查詢請(qǐng)求,其中,查詢請(qǐng)求可包括用戶指定進(jìn)行查詢的數(shù)據(jù)文件所對(duì)應(yīng)的文件名稱、優(yōu)先等級(jí)、查詢字段、導(dǎo)出文件路徑等信息。
[0108]在優(yōu)選的實(shí)施例中,請(qǐng)求獲取模塊110所獲取的查詢請(qǐng)求將為一個(gè)或者多個(gè),因此,將獲取的查詢請(qǐng)求保存至數(shù)據(jù)庫(kù)表,例如mysql表中,以作為若干個(gè)可執(zhí)行的任務(wù)有序執(zhí)行。
[0109]具體的,將通過(guò)設(shè)置定時(shí)器實(shí)現(xiàn)任務(wù)的調(diào)度。通過(guò)設(shè)置的定時(shí)器觸發(fā)計(jì)時(shí),以自動(dòng)循環(huán)監(jiān)控?cái)?shù)據(jù)庫(kù)表中保存的未執(zhí)行的任務(wù),判斷是否存在未執(zhí)行的任務(wù),若為是,則按照優(yōu)先等級(jí)的高低順序依次執(zhí)行數(shù)據(jù)庫(kù)表中尚未執(zhí)行的任務(wù),并在執(zhí)行成功后將該任務(wù)的狀態(tài)更新為已執(zhí)行。
[0110]定位模塊130,用于定位基于Hive的數(shù)據(jù)文件分區(qū)中查詢請(qǐng)求對(duì)應(yīng)的桶以及該桶中的列。
[0111]本實(shí)施例中,基于Hive的數(shù)據(jù)文件將存在于HDFS的目錄中,每一數(shù)據(jù)文件均為數(shù)據(jù)表的形式,并具備相同的數(shù)據(jù)表結(jié)構(gòu),以便于進(jìn)行數(shù)據(jù)的快速查詢。
[0112]具體的,數(shù)據(jù)文件中存儲(chǔ)的數(shù)據(jù)即為表數(shù)據(jù),這些數(shù)據(jù)在Hive中進(jìn)行分區(qū)、分桶存儲(chǔ),也就是說(shuō),分區(qū)是在Hive中創(chuàng)建一個(gè)目錄,其目錄名為分區(qū)信息,然后將數(shù)據(jù)分桶存入該目錄中,以實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)的優(yōu)化過(guò)程,進(jìn)而使得在數(shù)據(jù)的查詢過(guò)程中定位模塊130只需要查找到數(shù)據(jù)所在的桶,再對(duì)桶中的數(shù)據(jù)進(jìn)行查找即可得到所需要的數(shù)據(jù),而不需要對(duì)所有存儲(chǔ)的數(shù)據(jù)進(jìn)行逐一查找,有效地提高查詢效率,也減少了內(nèi)存的需求,減低了數(shù)據(jù)在網(wǎng)絡(luò)間的傳輸。
[0113]讀取模塊150,用于讀取定位得到的桶中的列所對(duì)應(yīng)的數(shù)據(jù)。
[0114]本實(shí)施例中,根據(jù)查詢請(qǐng)求中的查詢字段在定位得到的桶中進(jìn)行數(shù)據(jù)查找,以得到與該查詢字段相關(guān)的列,進(jìn)而讀取模塊150讀取該列所對(duì)應(yīng)的數(shù)據(jù),該數(shù)據(jù)即為當(dāng)前進(jìn)行數(shù)據(jù)查詢的查詢結(jié)果。
[0115]進(jìn)一步的,所得到的與查詢請(qǐng)求中的查詢字段相關(guān)的數(shù)據(jù)大都較多,因此,讀取模塊150將將讀取的數(shù)據(jù)合并成一個(gè)文件,并提示用戶當(dāng)前所進(jìn)行的數(shù)據(jù)查找執(zhí)行成功,在數(shù)據(jù)的查詢界面中提供查詢結(jié)果導(dǎo)出鏈接,以方便用戶導(dǎo)出包含了大量查詢結(jié)果的文件。
[0116]進(jìn)一步的,讀取模塊150還將由讀取的數(shù)據(jù)合并得到的文件保存至壓縮文件中,以節(jié)省存儲(chǔ)空間,在優(yōu)選的實(shí)施例中,該壓縮文件為cvs壓縮文件。
[0117]如圖6所示,在一個(gè)實(shí)施例中,上述定位模塊130包括轉(zhuǎn)換單元131、文件分區(qū)獲取單元133和位置獲取單元135。
[0118]轉(zhuǎn)換單元131,用于轉(zhuǎn)換查詢請(qǐng)求為MapReduce任務(wù)。
[0119]本實(shí)施例中,查詢請(qǐng)求為HQL語(yǔ)句,獲取得查詢請(qǐng)求之后,轉(zhuǎn)換單元131在底層將其轉(zhuǎn)換為相應(yīng)的MapReduce任務(wù),進(jìn)而對(duì)分布于各個(gè)節(jié)點(diǎn)的數(shù)據(jù)進(jìn)行并行處理,將有效提高處理效率。
[0120]文件分區(qū)獲取單元133,用于獲取元數(shù)據(jù),根據(jù)元數(shù)據(jù)得到與MapReduce任務(wù)相關(guān)的基于Hive的數(shù)據(jù)文件。
[0121]本實(shí)施例中,元數(shù)據(jù)包括了數(shù)據(jù)所在數(shù)據(jù)文件的文件名稱,該文件名稱將指示了數(shù)據(jù)文件中數(shù)據(jù)所在的分區(qū)等信息,因此,文件分區(qū)獲取單元133根據(jù)元數(shù)據(jù)即可得到與MapReduce任務(wù)相關(guān)的基于Hive的數(shù)據(jù)文件所在的待查詢的分區(qū),進(jìn)而實(shí)現(xiàn)數(shù)據(jù)的粗略查找。
[0122]位置獲取單元135,用于根據(jù)定義的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)對(duì)MapReduce任務(wù)中的查詢字段進(jìn)行計(jì)算以得到相應(yīng)的信息摘要值,并通過(guò)信息摘要值和預(yù)設(shè)的桶數(shù)量的取模得到與查詢字段對(duì)應(yīng)的數(shù)據(jù)存儲(chǔ)位置,數(shù)據(jù)存儲(chǔ)位置用于指示查詢字段對(duì)應(yīng)的桶和桶中的列。
[0123]本實(shí)施例中,位置獲取單元135提取MapReduce任務(wù)中的查詢字段,以對(duì)該查詢字段進(jìn)行信息摘要值的計(jì)算,例如,可通過(guò)Hash(哈希)算法實(shí)現(xiàn),以得到相應(yīng)的信息摘要值。
[0124]位置獲取單元135所提取的查詢字段將是根據(jù)進(jìn)行數(shù)據(jù)存儲(chǔ)時(shí)定義的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)指定的,因此,并不需要提取所有的查詢字段進(jìn)行信息摘要值的計(jì)算。具體的,在進(jìn)行數(shù)據(jù)存儲(chǔ)時(shí)將根據(jù)定義的字段進(jìn)行指定,例如,將通過(guò)語(yǔ)句“create table ip_login('uid' string, ' ip'string, 'time'int)PARTIT1NED BY(tm int)CLUSTERED BY(' uid') SORTEDBY (' uid') INT02BUCKETS STORED AS ORC”實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ),其中,需要進(jìn)行信息摘要值計(jì)算的查詢字段將由CLUSTERED BY指定。
[0125]計(jì)算得到相應(yīng)的信息摘要值之后,位置獲取單元135將通過(guò)信息摘要值和預(yù)設(shè)的桶數(shù)量進(jìn)行數(shù)據(jù)的分桶,進(jìn)而得到與該查詢字段相關(guān)的數(shù)據(jù)所在的桶。具體的,位置獲取單元135將用計(jì)算所得到的信息摘要值和預(yù)設(shè)的桶數(shù)量取模來(lái)進(jìn)行數(shù)據(jù)存儲(chǔ)位置的切分,以精確得到與查詢字段相關(guān)的數(shù)據(jù)所對(duì)應(yīng)的數(shù)據(jù)存儲(chǔ)位置,即存儲(chǔ)了與查詢字段相關(guān)的數(shù)據(jù)的桶。
[0126]例如,如上所述列舉的語(yǔ)句中,由CLUSTERED BY指定的需要進(jìn)行信息摘要值計(jì)算的查詢字段為uid字段,此時(shí),將通過(guò)uid字段計(jì)算信息摘要值,然后通過(guò)該值和桶數(shù)量,即“2BUCKETS”中的“2”取模得到對(duì)應(yīng)的數(shù)據(jù)存儲(chǔ)位置。
[0127]此時(shí),位置獲取單元135將在存儲(chǔ)了與查詢字段相關(guān)的數(shù)據(jù)的桶所限定的區(qū)域進(jìn)行數(shù)據(jù)的查詢,以查找得到存儲(chǔ)了與查詢字段相關(guān)的數(shù)據(jù)的列。
[0128]通過(guò)如上所述的數(shù)據(jù)查詢,將不需要對(duì)所有數(shù)據(jù)文件進(jìn)行數(shù)據(jù)的查詢即可實(shí)現(xiàn)數(shù)據(jù)的精細(xì)查詢,進(jìn)而使得數(shù)據(jù)的查詢可隨意應(yīng)用于海量數(shù)據(jù),在提高了查詢效率和查詢速度的同時(shí)也提高了查詢的精確度。
[0129]在一個(gè)實(shí)施例中,讀取模塊150還用于根據(jù)查詢字段對(duì)應(yīng)的桶中的列進(jìn)行數(shù)據(jù)加載,并對(duì)加載的數(shù)據(jù)進(jìn)行處理。
[0130]本實(shí)施例中,讀取模塊150加載記錄于查詢字段對(duì)應(yīng)的桶中的列的數(shù)據(jù),并通過(guò)加載的數(shù)據(jù)進(jìn)行適當(dāng)處理,以便于向用戶提供相應(yīng)的查詢結(jié)果。具體的,讀取模塊150對(duì)加載的數(shù)據(jù)所進(jìn)行的處理可以是將加載的數(shù)據(jù)可逐一顯示于數(shù)據(jù)的查詢界面中;也可合并為一個(gè)文件,并按照預(yù)設(shè)的路徑進(jìn)行存儲(chǔ),進(jìn)而在數(shù)據(jù)的查詢界面中提供查詢結(jié)果導(dǎo)出鏈接,即該文件的導(dǎo)出路徑,用戶可通過(guò)導(dǎo)出文件的方式進(jìn)行查詢結(jié)果的查看;也可以是對(duì)該列進(jìn)行相應(yīng)的計(jì)算,例如,與其它數(shù)據(jù)文件相關(guān)聯(lián)、列值去重等。
[0131]如圖7所示,在另一個(gè)實(shí)施例中,上述系統(tǒng)還包括原始數(shù)據(jù)存儲(chǔ)模塊210和優(yōu)化處理模塊230。
[0132]原始數(shù)據(jù)存儲(chǔ)模塊210,用于接收輸入的原始數(shù)據(jù),并將原始數(shù)據(jù)存儲(chǔ)為第一數(shù)據(jù)表結(jié)構(gòu)。
[0133]本實(shí)施例中,第一數(shù)據(jù)表結(jié)構(gòu)定義了原始數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)。原始數(shù)據(jù)存儲(chǔ)模塊210將接收不同數(shù)據(jù)源的原始數(shù)據(jù)輸入,此時(shí),將原始數(shù)據(jù)按照第一數(shù)據(jù)表結(jié)構(gòu)直接存儲(chǔ)至HDFS的相應(yīng)目錄中。
[0134]具體的,原始數(shù)據(jù)的加載將不會(huì)對(duì)該原始數(shù)據(jù)進(jìn)行任何的校驗(yàn)、壓縮等優(yōu)化操作,而只是按照第一數(shù)據(jù)表結(jié)構(gòu)將原始數(shù)據(jù)直接上傳到HDFS的相應(yīng)目錄中。
[0135]這一第一數(shù)據(jù)表結(jié)構(gòu)所對(duì)應(yīng)的數(shù)據(jù)文件也將是數(shù)據(jù)表的形式,并且也將只保存本次加載的原始數(shù)據(jù),再次進(jìn)行原始數(shù)據(jù)的加載時(shí)將直接覆蓋原有的原始數(shù)據(jù)。
[0136]進(jìn)一步的,該第一數(shù)據(jù)表結(jié)構(gòu)所對(duì)應(yīng)的數(shù)據(jù)文件中,其文件名稱將通過(guò)配置文件進(jìn)行配置,例如,可以是原始數(shù)據(jù)所對(duì)應(yīng)的實(shí)際文件名稱附加上相應(yīng)的標(biāo)識(shí),例如,user_gambling_text,其中,user_gambling即為原始數(shù)據(jù)所對(duì)應(yīng)的實(shí)際文件名稱,text為附加的標(biāo)識(shí)。
[0137]優(yōu)化處理模塊230,用于對(duì)存儲(chǔ)為第一數(shù)據(jù)表結(jié)構(gòu)的原始數(shù)據(jù)進(jìn)行優(yōu)化處理,以將優(yōu)化處理所得到的數(shù)據(jù)存入配置文件所配置的基于Hive的數(shù)據(jù)文件分區(qū)中。
[0138]本實(shí)施例中,優(yōu)化處理模塊230將對(duì)存儲(chǔ)為第一數(shù)據(jù)表結(jié)構(gòu)的原始數(shù)據(jù)進(jìn)行分區(qū)、分桶、排序等優(yōu)化處理,以優(yōu)化數(shù)據(jù)的存儲(chǔ)方式,進(jìn)而將優(yōu)化處理所得到的數(shù)據(jù)存入基于Hive的數(shù)據(jù)文件分區(qū)中,使當(dāng)期數(shù)據(jù)與歷史數(shù)據(jù)相分離,大為提升存儲(chǔ)和處理效率。
[0139]進(jìn)一步的,優(yōu)化處理模塊230通過(guò)配置文件為優(yōu)化處理所得到的數(shù)據(jù)配置相應(yīng)的數(shù)據(jù)文件,以得到相應(yīng)的元數(shù)據(jù),進(jìn)而便于進(jìn)行數(shù)據(jù)的存入和查詢。
[0140]在一個(gè)實(shí)施例中,上述原始數(shù)據(jù)加載模塊210還用于通過(guò)配置文件將原始數(shù)據(jù)存入包含分區(qū)信息數(shù)據(jù)文件中,其中,被存入數(shù)據(jù)文件的原始文件以JSON格式存儲(chǔ)來(lái)。
[0141]本實(shí)施例中,原始數(shù)據(jù)存儲(chǔ)模塊210通過(guò)配置文件為當(dāng)前所進(jìn)行的原始數(shù)據(jù)存入配置相應(yīng)的元數(shù)據(jù),即加載為第一數(shù)據(jù)表結(jié)構(gòu)的原始數(shù)據(jù)配置數(shù)據(jù)文