本申請(qǐng)涉及數(shù)據(jù)處理領(lǐng)域,具體而言,涉及一種HBase數(shù)據(jù)庫(kù)的數(shù)據(jù)查詢方法和裝置。
背景技術(shù):
因?yàn)槌R?guī)的關(guān)系型數(shù)據(jù)庫(kù)無(wú)法滿足快速查找指定用戶明細(xì)數(shù)據(jù)的需求,當(dāng)前把超大量用戶明細(xì)數(shù)據(jù)保存到HBase分布式數(shù)據(jù)庫(kù)中。通過(guò)合理的設(shè)置HBase的Rowkey,可以把同一個(gè)用戶的明細(xì)數(shù)據(jù)在物理上保存到分布式集群的同一個(gè)節(jié)點(diǎn)中,同時(shí)把時(shí)間因素加入Rowkey中,可以快速的獲取指定用戶按照時(shí)間排序的明細(xì)數(shù)據(jù)。
HBase本身提供的獲取數(shù)據(jù)方式只有指定或不指定起止Rowkey的順序掃描。同時(shí)針對(duì)相對(duì)復(fù)雜的查詢需求,提供了諸多可以使用的過(guò)濾器。對(duì)于快速獲取指定用戶明細(xì)數(shù)據(jù)這一需求,在設(shè)計(jì)Rowkey時(shí),使用用戶唯一標(biāo)識(shí)編號(hào)作為Rowkey的頭,明細(xì)發(fā)生時(shí)間作為Rowkey的中間部分,尾部則是長(zhǎng)度為3的隨機(jī)字符。使用這種設(shè)計(jì),可以通過(guò)使用HBase自帶的前綴過(guò)濾器,獲取指定用戶的明細(xì)數(shù)據(jù)。
HBase的前綴過(guò)濾器是一種過(guò)濾手段。它的整個(gè)流程是順序掃描全表,然后把可以滿足前綴過(guò)濾條件的Rowkey數(shù)據(jù)返回到客戶端。它的主要缺點(diǎn)是,整個(gè)過(guò)程需要掃描全表,因此隨著表的數(shù)據(jù)增多,即使所需要的指定用戶明細(xì)數(shù)據(jù)沒(méi)有大量增長(zhǎng),過(guò)濾過(guò)程也會(huì)變得越來(lái)越慢。
針對(duì)上述的問(wèn)題,目前尚未提出有效的解決方案。
技術(shù)實(shí)現(xiàn)要素:
本申請(qǐng)實(shí)施例提供了一種HBase數(shù)據(jù)庫(kù)的數(shù)據(jù)查詢方法和裝置,以至少解決現(xiàn)有技術(shù)中HBase數(shù)據(jù)庫(kù)中定位用戶數(shù)據(jù)的效率比較低的技術(shù)問(wèn)題。
根據(jù)本申請(qǐng)實(shí)施例的一個(gè)方面,提供了一種HBase數(shù)據(jù)庫(kù)的數(shù)據(jù)查詢方法,包括:設(shè)置掃描所述HBase數(shù)據(jù)庫(kù)的開(kāi)始行;根據(jù)所述開(kāi)始行計(jì)算掃描所述HBase數(shù)據(jù)庫(kù)的結(jié)束行;以及在所述開(kāi)始行至所述結(jié)束行所表示的范圍內(nèi)掃描所述HBase數(shù)據(jù)庫(kù)。
進(jìn)一步地,根據(jù)所述開(kāi)始行計(jì)算掃描所述HBase數(shù)據(jù)庫(kù)的結(jié)束行包括:獲取表示 所述開(kāi)始行上的數(shù)據(jù)的第一字節(jié)數(shù)組;計(jì)算所述第一字節(jié)數(shù)組與預(yù)設(shè)字節(jié)的字節(jié)數(shù)組之和,得到第二字節(jié)數(shù)組;以及確定所述第二字節(jié)數(shù)組所表示的行為所述結(jié)束行。
進(jìn)一步地,所述預(yù)設(shè)字節(jié)為1。
進(jìn)一步地,在設(shè)置掃描所述HBase數(shù)據(jù)庫(kù)的開(kāi)始行之前,所述方法還包括:將待存儲(chǔ)至所述HBase數(shù)據(jù)庫(kù)的源數(shù)據(jù)轉(zhuǎn)換為字節(jié)數(shù)組;以及在所述HBase數(shù)據(jù)庫(kù)中存儲(chǔ)所述字節(jié)數(shù)組。
進(jìn)一步地,所述源數(shù)據(jù)包括來(lái)自不同用戶的訪問(wèn)數(shù)據(jù),在所述HBase數(shù)據(jù)庫(kù)中存儲(chǔ)所述字節(jié)數(shù)組包括:按照不同用戶的用戶標(biāo)識(shí)對(duì)轉(zhuǎn)換后的所述字節(jié)數(shù)組進(jìn)行分組,其中,具有相同用戶標(biāo)識(shí)的所述字節(jié)數(shù)組處于同一組內(nèi);以及存儲(chǔ)分組后的所述字節(jié)數(shù)組。
進(jìn)一步地,所述開(kāi)始行為待查詢數(shù)據(jù)的唯一標(biāo)識(shí)所處的行。
根據(jù)本申請(qǐng)實(shí)施例的另一個(gè)方面,提供了一種HBase數(shù)據(jù)庫(kù)的數(shù)據(jù)查詢裝置,包括:設(shè)置單元,用于設(shè)置掃描所述HBase數(shù)據(jù)庫(kù)的開(kāi)始行;計(jì)算單元,用于根據(jù)所述開(kāi)始行計(jì)算掃描所述HBase數(shù)據(jù)庫(kù)的結(jié)束行;以及掃描單元,用于在所述開(kāi)始行至所述結(jié)束行所表示的范圍內(nèi)掃描所述HBase數(shù)據(jù)庫(kù)。
進(jìn)一步地,所述計(jì)算單元包括:獲取模塊,用于獲取表示所述開(kāi)始行上的數(shù)據(jù)的第一字節(jié)數(shù)組;計(jì)算模塊,用于計(jì)算所述第一字節(jié)數(shù)組與預(yù)設(shè)字節(jié)的字節(jié)數(shù)組之和,得到第二字節(jié)數(shù)組;以及確定模塊,用于確定所述第二字節(jié)數(shù)組所表示的行為所述結(jié)束行。
進(jìn)一步地,所述預(yù)設(shè)字節(jié)為1。
進(jìn)一步地,所述裝置還包括:轉(zhuǎn)換單元,用于在設(shè)置掃描所述HBase數(shù)據(jù)庫(kù)的開(kāi)始行之前,將待存儲(chǔ)至所述HBase數(shù)據(jù)庫(kù)的源數(shù)據(jù)轉(zhuǎn)換為字節(jié)數(shù)組;以及存儲(chǔ)單元,用于在所述HBase數(shù)據(jù)庫(kù)中存儲(chǔ)所述字節(jié)數(shù)組。
進(jìn)一步地,所述存儲(chǔ)單元包括:分組模塊,用于按照不同用戶的用戶標(biāo)識(shí)對(duì)轉(zhuǎn)換后的所述字節(jié)數(shù)組進(jìn)行分組,其中,具有相同用戶標(biāo)識(shí)的所述字節(jié)數(shù)組處于同一組內(nèi);以及存儲(chǔ)模塊,用于存儲(chǔ)分組后的所述字節(jié)數(shù)組。
進(jìn)一步地,所述開(kāi)始行為待查詢數(shù)據(jù)的唯一標(biāo)識(shí)所處的行。
在本申請(qǐng)實(shí)施例中,采用了HBase數(shù)據(jù)庫(kù)的數(shù)據(jù)查詢方法。通過(guò)設(shè)置掃描HBase數(shù)據(jù)庫(kù)的開(kāi)始行,根據(jù)開(kāi)始行計(jì)算掃描HBase數(shù)據(jù)庫(kù)的結(jié)束行,在開(kāi)始行至結(jié)束行所 表示的范圍內(nèi)掃描HBase數(shù)據(jù)庫(kù),可以實(shí)現(xiàn)掃描范圍從全表縮小至指定的開(kāi)始行和結(jié)束行之間,實(shí)現(xiàn)了加快查詢速度,提高掃描效率的技術(shù)效果,進(jìn)而解決了現(xiàn)有技術(shù)中HBase數(shù)據(jù)庫(kù)中定位用戶數(shù)據(jù)的效率比較低的技術(shù)問(wèn)題。
附圖說(shuō)明
此處所說(shuō)明的附圖用來(lái)提供對(duì)本申請(qǐng)的進(jìn)一步理解,構(gòu)成本申請(qǐng)的一部分,本申請(qǐng)的示意性實(shí)施例及其說(shuō)明用于解釋本申請(qǐng),并不構(gòu)成對(duì)本申請(qǐng)的不當(dāng)限定。在附圖中:
圖1是根據(jù)本申請(qǐng)實(shí)施例的一種HBase數(shù)據(jù)庫(kù)的數(shù)據(jù)查詢方法的流程圖;以及
圖2是根據(jù)本申請(qǐng)實(shí)施例的一種HBase數(shù)據(jù)庫(kù)的數(shù)據(jù)查詢裝置的示意圖。
具體實(shí)施方式
為了使本技術(shù)領(lǐng)域的人員更好地理解本申請(qǐng)方案,下面將結(jié)合本申請(qǐng)實(shí)施例中的附圖,對(duì)本申請(qǐng)實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本申請(qǐng)一部分的實(shí)施例,而不是全部的實(shí)施例?;诒旧暾?qǐng)中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都應(yīng)當(dāng)屬于本申請(qǐng)保護(hù)的范圍。
需要說(shuō)明的是,本申請(qǐng)的說(shuō)明書(shū)和權(quán)利要求書(shū)及上述附圖中的術(shù)語(yǔ)“第一”、“第二”等是用于區(qū)別類似的對(duì)象,而不必用于描述特定的順序或先后次序。應(yīng)該理解這樣使用的數(shù)據(jù)在適當(dāng)情況下可以互換,以便這里描述的本申請(qǐng)的實(shí)施例能夠以除了在這里圖示或描述的那些以外的順序?qū)嵤?。此外,術(shù)語(yǔ)“包括”和“具有”以及他們的任何變形,意圖在于覆蓋不排他的包含,例如,包含了一系列步驟或單元的過(guò)程、方法、系統(tǒng)、產(chǎn)品或設(shè)備不必限于清楚地列出的那些步驟或單元,而是可包括沒(méi)有清楚地列出的或?qū)τ谶@些過(guò)程、方法、產(chǎn)品或設(shè)備固有的其它步驟或單元。
首先對(duì)本申請(qǐng)實(shí)施例所涉及的技術(shù)術(shù)語(yǔ)作如下解釋:
HBase:是一個(gè)分布式的、面向列的開(kāi)源數(shù)據(jù)庫(kù),一個(gè)結(jié)構(gòu)化數(shù)據(jù)的分布式存儲(chǔ)系統(tǒng)。HBase不同于一般的關(guān)系數(shù)據(jù)庫(kù),它是一個(gè)適合于非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)的數(shù)據(jù)庫(kù)。另一個(gè)不同的是HBase基于列的而不是基于行的模式。
Rowkey:行主鍵,是HBase的數(shù)據(jù)唯一標(biāo)識(shí)。HBase保存數(shù)據(jù)依照Rowkey排序,HBase查詢數(shù)據(jù)也是基于Rowkey,或者直接獲取指定單一Rowkey的整條數(shù)據(jù),或者掃描開(kāi)始Rowkey到結(jié)束Rowkey的整個(gè)數(shù)據(jù)區(qū)間。
根據(jù)本申請(qǐng)實(shí)施例,提供了一種HBase數(shù)據(jù)庫(kù)的數(shù)據(jù)查詢方法的方法實(shí)施例,需要說(shuō)明的是,在附圖的流程圖示出的步驟可以在諸如一組計(jì)算機(jī)可執(zhí)行指令的計(jì)算機(jī)系統(tǒng)中執(zhí)行,并且,雖然在流程圖中示出了邏輯順序,但是在某些情況下,可以以不同于此處的順序執(zhí)行所示出或描述的步驟。
圖1是根據(jù)本申請(qǐng)實(shí)施例的一種HBase數(shù)據(jù)庫(kù)的數(shù)據(jù)查詢方法的流程圖。如圖1所示,該HBase數(shù)據(jù)庫(kù)的數(shù)據(jù)查詢方法包括如下步驟:
步驟S102,設(shè)置掃描HBase數(shù)據(jù)庫(kù)的開(kāi)始行。
例如,HBase數(shù)據(jù)庫(kù)里一共有10個(gè)字節(jié)數(shù)組,分別如下:
[97,98,102,50,48,49,53,48,51,48,54,102]、
[97,98,102,50,48,49,53,48,51,48,55,101]、
[97,98,102,50,48,49,53,48,51,48,56,103]、
[97,98,103,50,48,49,53,48,51,48,57,99]、
[97,98,103,50,48,49,53,48,52,49,48,110]、
[97,98,103,50,48,49,53,48,53,49,50,109]、
[97,98,103,50,48,49,53,48,55,50,48,110]、
[97,98,104,50,48,49,53,48,50,48,53,99]、
[97,98,104,50,48,49,53,48,54,49,52,114]、
[97,98,105,50,48,49,53,48,53,49,57,104]。
設(shè)置[97,98,103,50,48,49,53,48,51,48,57,99]為掃描開(kāi)始行,即從第4個(gè)字節(jié)數(shù)組開(kāi)始掃描。
設(shè)置[97,98,104,50,48,49,53,48,50,48,53,99]為掃描開(kāi)始行,即從第8個(gè)字節(jié)數(shù)組開(kāi)始掃描。
步驟S104,根據(jù)開(kāi)始行計(jì)算掃描HBase數(shù)據(jù)庫(kù)的結(jié)束行。
根據(jù)開(kāi)始行計(jì)算掃描HBase數(shù)據(jù)庫(kù)的結(jié)束行可以有多種方法。
開(kāi)始行的字節(jié)數(shù)組為[97,98,103,50,48,49,53,48,51,48,57,99],開(kāi)始行的第一字節(jié)數(shù)組為[97,98,103]。設(shè)置第二字節(jié)數(shù)組為開(kāi)始行的第一字節(jié)數(shù)組加上[0,0,1],即[97,98,104]為第二字節(jié)數(shù)組,那么[97,98,104,50,48,49,53,48,50,48,53,99]即為 包含第二字節(jié)數(shù)組的第一行,即為掃描的結(jié)束行。第一字節(jié)數(shù)組和第二字節(jié)數(shù)組可以使用字節(jié)數(shù)組中的前三位元素來(lái)標(biāo)識(shí)開(kāi)始行和結(jié)束行,也可以使用第4位至第11位共8位元素來(lái)標(biāo)識(shí)開(kāi)始行和結(jié)束行。
步驟S106,在開(kāi)始行至結(jié)束行所表示的范圍內(nèi)掃描HBase數(shù)據(jù)庫(kù)。
例如,開(kāi)始行為[97,98,103,50,48,49,53,48,51,48,57,99],結(jié)束行為[97,98,104,50,48,49,53,48,50,48,53,99],則掃描第4至8個(gè)字節(jié)數(shù)組。又例如,開(kāi)始行為[97,98,102,50,48,49,53,48,51,48,54,102],結(jié)束行為[97,98,103,50,48,49,53,48,51,48,57,99],則掃描第1至第4個(gè)字節(jié)數(shù)組。
通過(guò)上述步驟,設(shè)置掃描HBase數(shù)據(jù)庫(kù)的開(kāi)始行,根據(jù)開(kāi)始行計(jì)算掃描HBase數(shù)據(jù)庫(kù)的結(jié)束行,在開(kāi)始行至結(jié)束行所表示的范圍內(nèi)掃描HBase數(shù)據(jù)庫(kù),可以實(shí)現(xiàn)掃描范圍從全表縮小至指定的開(kāi)始行和結(jié)束行之間,達(dá)到加快查詢速度,提高掃描效率的效果。
可選地,在設(shè)置掃描HBase數(shù)據(jù)庫(kù)的開(kāi)始行之前,方法還包括:將待存儲(chǔ)至HBase數(shù)據(jù)庫(kù)的源數(shù)據(jù)轉(zhuǎn)換為字節(jié)數(shù)組;以及在HBase數(shù)據(jù)庫(kù)中存儲(chǔ)字節(jié)數(shù)組。
比如,源數(shù)據(jù)為字符串“abf20150306f”,將該字符串“abf20150306f”轉(zhuǎn)換成字節(jié)數(shù)組為[97,98,102,50,48,49,53,48,51,48,54,102];
源數(shù)據(jù)為字符串“abf20150307e”,將該字符串“abf20150307e”轉(zhuǎn)換成字節(jié)數(shù)組為[97,98,102,50,48,49,53,48,51,48,55,101];
源數(shù)據(jù)為字符串“abf20150308g”,將該字符串“abf20150308g”轉(zhuǎn)換成字節(jié)數(shù)組為[97,98,102,50,48,49,53,48,51,48,56,103];
源數(shù)據(jù)為字符串“abg20150309c”,將該字符串“abg20150309c”轉(zhuǎn)換成字節(jié)數(shù)組為[97,98,103,50,48,49,53,48,51,48,57,99];
源數(shù)據(jù)為字符串“abg20150410n”,將該字符串“abg20150410n”轉(zhuǎn)換成字節(jié)數(shù)組為[97,98,103,50,48,49,53,48,52,49,48,110];
源數(shù)據(jù)為字符串“abg20150512m”,將該字符串“abg20150512m”轉(zhuǎn)換成字節(jié)數(shù)組為[97,98,103,50,48,49,53,48,53,49,50,109];
源數(shù)據(jù)為字符串“abg20150720n”,將該字符串“abg20150720n”轉(zhuǎn)換成字節(jié)數(shù)組為[97,98,103,50,48,49,53,48,55,50,48,110];
源數(shù)據(jù)為字符串“abh20150205c”,將該字符串“abh20150205c”轉(zhuǎn)換成字節(jié)數(shù)組 為[97,98,104,50,48,49,53,48,50,48,53,99];
源數(shù)據(jù)為字符串“abh20150614r”,將該字符串“abh20150614r”轉(zhuǎn)換成字節(jié)數(shù)組為[97,98,104,50,48,49,53,48,54,49,52,114];
源數(shù)據(jù)為字符串“abi20150519h”,將該字符串“abi20150519h”轉(zhuǎn)換成字節(jié)數(shù)組為[97,98,105,50,48,49,53,48,53,49,57,104]。
把轉(zhuǎn)換后的字節(jié)數(shù)組進(jìn)行存儲(chǔ)。
通過(guò)把源數(shù)據(jù)轉(zhuǎn)換成字節(jié)數(shù)組,達(dá)到便于計(jì)算機(jī)存儲(chǔ)的效果。
可選地,源數(shù)據(jù)包括來(lái)自不同用戶的訪問(wèn)數(shù)據(jù),在HBase數(shù)據(jù)庫(kù)中存儲(chǔ)字節(jié)數(shù)組包括:按照不同用戶的用戶標(biāo)識(shí)對(duì)轉(zhuǎn)換后的字節(jié)數(shù)組進(jìn)行分組,其中,具有相同用戶標(biāo)識(shí)的字節(jié)數(shù)組處于同一組內(nèi);以及存儲(chǔ)分組后的字節(jié)數(shù)組。
有10條訪問(wèn)數(shù)據(jù),經(jīng)過(guò)轉(zhuǎn)換后的字節(jié)數(shù)組為:
[97,98,102,50,48,49,53,48,51,48,54,102]、
[97,98,102,50,48,49,53,48,51,48,55,101]、
[97,98,102,50,48,49,53,48,51,48,56,103]、
[97,98,103,50,48,49,53,48,51,48,57,99]、
[97,98,103,50,48,49,53,48,52,49,48,110]、
[97,98,103,50,48,49,53,48,53,49,50,109]、
[97,98,103,50,48,49,53,48,55,50,48,110]、
[97,98,104,50,48,49,53,48,50,48,53,99]、
[97,98,104,50,48,49,53,48,54,49,52,114]、
[97,98,105,50,48,49,53,48,53,49,57,104]。
以上10個(gè)字節(jié)數(shù)組存在4個(gè)不同的用戶標(biāo)識(shí),即這10個(gè)字節(jié)數(shù)組是4個(gè)用戶的訪問(wèn)數(shù)據(jù)轉(zhuǎn)換后得到的。這4個(gè)不同的用戶標(biāo)識(shí)分別為[97,98,102]、[97,98,103]、[97,98,104]、[97,98,105]。
把具有相同用戶標(biāo)識(shí)的字節(jié)數(shù)組分到一組,例如,以上10個(gè)字節(jié)數(shù)組一共分成4組,其中,第1組包括3個(gè)字節(jié)數(shù)組,分別為:
[97,98,102,50,48,49,53,48,51,48,54,102]、
[97,98,102,50,48,49,53,48,51,48,55,101]、
[97,98,102,50,48,49,53,48,51,48,56,103];
第2組包括4個(gè)字節(jié)數(shù)組,分別為:
[97,98,103,50,48,49,53,48,51,48,57,99]、
[97,98,103,50,48,49,53,48,52,49,48,110]、
[97,98,103,50,48,49,53,48,53,49,50,109]、
[97,98,103,50,48,49,53,48,55,50,48,110];
第3組包括2個(gè)字節(jié)數(shù)組,分別為:
[97,98,104,50,48,49,53,48,50,48,53,99]、
[97,98,104,50,48,49,53,48,54,49,52,114];
第4組包括1個(gè)字節(jié)數(shù)組,為[97,98,105,50,48,49,53,48,53,49,57,104]。
通過(guò)把字節(jié)數(shù)組分組存儲(chǔ),使每一組的字節(jié)數(shù)組都是由某一用戶的源數(shù)據(jù)轉(zhuǎn)換而來(lái),達(dá)到了不同用戶數(shù)據(jù)分開(kāi)存儲(chǔ)的效果。
可選地,開(kāi)始行為待查詢數(shù)據(jù)的唯一標(biāo)識(shí)所處的行。唯一標(biāo)識(shí)可以是某一用戶的用戶標(biāo)識(shí)。
例如,要查詢用戶乙,用戶乙的唯一標(biāo)識(shí)是[97,98,103],則用戶乙的唯一標(biāo)識(shí)所處的行是[97,98,103,50,48,49,53,48,51,48,57,99],即這一行即為查詢的開(kāi)始行。
通過(guò)指定開(kāi)始行為待查詢數(shù)據(jù)的唯一標(biāo)識(shí)所處的行,不用再?gòu)念^掃描全表,達(dá)到了提高掃描效率的效果。
可選地,根據(jù)開(kāi)始行計(jì)算掃描HBase數(shù)據(jù)庫(kù)的結(jié)束行包括:獲取表示開(kāi)始行上的數(shù)據(jù)的第一字節(jié)數(shù)組;計(jì)算第一字節(jié)數(shù)組與預(yù)設(shè)字節(jié)的字節(jié)數(shù)組之和,得到第二字節(jié)數(shù)組;以及確定第二字節(jié)數(shù)組所表示的行為結(jié)束行。
可選地,預(yù)設(shè)字節(jié)為1。在本申請(qǐng)實(shí)施例中,表示預(yù)設(shè)字節(jié)的字節(jié)數(shù)組的行列結(jié)構(gòu)和第一字節(jié)數(shù)組的行列結(jié)構(gòu)相同,對(duì)于預(yù)設(shè)字節(jié)為1的情況,可以使用預(yù)設(shè)字節(jié)的字節(jié)數(shù)組中的首位元素為1、其它位元素為0來(lái)表示字節(jié)1,也可以使用預(yù)設(shè)字節(jié)的字節(jié)數(shù)組中的末位元素為1、其它位元素為0來(lái)表示字節(jié)1,還可以使用預(yù)設(shè)字節(jié)的字節(jié) 數(shù)組中任一位置的元素為1、其它位的元素為0來(lái)表示字節(jié)1。在本申請(qǐng)實(shí)施例中,以使用預(yù)設(shè)字節(jié)的字節(jié)數(shù)組中的
末位元素為1、其它位元素為0來(lái)表示字節(jié)1為例進(jìn)行具體介紹。
例如,開(kāi)始行為abg20150309c,則開(kāi)始行的字節(jié)數(shù)組為[97,98,103,50,48,49,53,48,51,48,57,99],開(kāi)始行的第一字節(jié)數(shù)組為[97,98,103]。預(yù)設(shè)字節(jié)可以取1,則表示預(yù)設(shè)字節(jié)1的字節(jié)數(shù)組可以為[0,0,1],第一字節(jié)數(shù)組與預(yù)設(shè)字節(jié)的字節(jié)數(shù)組之和為[97,98,104],即[97,98,104]為第二字節(jié)數(shù)組,那么[97,98,104,50,48,49,53,48,50,48,53,99]即為結(jié)束行。
通過(guò)確定結(jié)束行,使掃描在開(kāi)始行與結(jié)束行之間的范圍進(jìn)行,縮小了掃描范圍,提高了查詢效率。
根據(jù)本申請(qǐng)實(shí)施例,還提供了一種HBase數(shù)據(jù)庫(kù)的數(shù)據(jù)查詢裝置的實(shí)施例。該HBase數(shù)據(jù)庫(kù)的數(shù)據(jù)查詢裝置可以執(zhí)行上述HBase數(shù)據(jù)庫(kù)的數(shù)據(jù)查詢方法,上述HBase數(shù)據(jù)庫(kù)的數(shù)據(jù)查詢方法也可以通過(guò)本HBase數(shù)據(jù)庫(kù)的數(shù)據(jù)查詢裝置實(shí)施。
圖2是根據(jù)本發(fā)明實(shí)施例的一種HBase數(shù)據(jù)庫(kù)的數(shù)據(jù)查詢裝置。如圖2所示,該HBase數(shù)據(jù)庫(kù)的數(shù)據(jù)查詢裝置包括:設(shè)置單元20、計(jì)算單元40、掃描單元60。
設(shè)置單元20,用于設(shè)置掃描HBase數(shù)據(jù)庫(kù)的開(kāi)始行。
例如,HBase數(shù)據(jù)庫(kù)里一共有10個(gè)字節(jié)數(shù)組,分別如下:
[97,98,102,50,48,49,53,48,51,48,54,102]、
[97,98,102,50,48,49,53,48,51,48,55,101]、
[97,98,102,50,48,49,53,48,51,48,56,103]、
[97,98,103,50,48,49,53,48,51,48,57,99]、
[97,98,103,50,48,49,53,48,52,49,48,110]、
[97,98,103,50,48,49,53,48,53,49,50,109]、
[97,98,103,50,48,49,53,48,55,50,48,110]、
[97,98,104,50,48,49,53,48,50,48,53,99]、
[97,98,104,50,48,49,53,48,54,49,52,114]、
[97,98,105,50,48,49,53,48,53,49,57,104]。
設(shè)置[97,98,103,50,48,49,53,48,51,48,57,99]為掃描開(kāi)始行,即從第4個(gè)字節(jié)數(shù)組開(kāi)始掃描。
設(shè)置[97,98,104,50,48,49,53,48,50,48,53,99]為掃描開(kāi)始行,即從第8個(gè)字節(jié)數(shù)組開(kāi)始掃描。
計(jì)算單元40,用于根據(jù)開(kāi)始行計(jì)算掃描HBase數(shù)據(jù)庫(kù)的結(jié)束行。
根據(jù)開(kāi)始行計(jì)算掃描HBase數(shù)據(jù)庫(kù)的結(jié)束行可以有多種方法。
開(kāi)始行的字節(jié)數(shù)組為[97,98,103,50,48,49,53,48,51,48,57,99],開(kāi)始行的第一字節(jié)數(shù)組為[97,98,103]。設(shè)置第二字節(jié)數(shù)組為開(kāi)始行的第一字節(jié)數(shù)組加上[0,0,1],即[97,98,104]為第二字節(jié)數(shù)組,那么[97,98,104,50,48,49,53,48,50,48,53,99]即為包含第二字節(jié)數(shù)組的第一行,即為掃描的結(jié)束行。第一字節(jié)數(shù)組和第二字節(jié)數(shù)組可以使用字節(jié)數(shù)組中的前三位元素來(lái)標(biāo)識(shí)開(kāi)始行和結(jié)束行,也可以使用第4位至第11位共8位元素來(lái)標(biāo)識(shí)開(kāi)始行和結(jié)束行。
掃描單元60,用于在開(kāi)始行至結(jié)束行所表示的范圍內(nèi)掃描HBase數(shù)據(jù)庫(kù)。
例如,開(kāi)始行為[97,98,103,50,48,49,53,48,51,48,57,99],結(jié)束行為[97,98,104,50,48,49,53,48,50,48,53,99],則掃描第4至8個(gè)字節(jié)數(shù)組。又例如,開(kāi)始行為[97,98,102,50,48,49,53,48,51,48,54,102],結(jié)束行為[97,98,103,50,48,49,53,48,51,48,57,99],則掃描第1至第4個(gè)字節(jié)數(shù)組。
通過(guò)上述方式,設(shè)置掃描HBase數(shù)據(jù)庫(kù)的開(kāi)始行,根據(jù)開(kāi)始行計(jì)算掃描HBase數(shù)據(jù)庫(kù)的結(jié)束行,在開(kāi)始行至結(jié)束行所表示的范圍內(nèi)掃描HBase數(shù)據(jù)庫(kù),可以實(shí)現(xiàn)掃描范圍從全表縮小至指定的開(kāi)始行和結(jié)束行之間,達(dá)到加快查詢速度,提高掃描效率的效果。
可選地,本申請(qǐng)實(shí)施例所提供的HBase數(shù)據(jù)庫(kù)的數(shù)據(jù)查詢裝置還包括:轉(zhuǎn)換單元,用于在設(shè)置掃描HBase數(shù)據(jù)庫(kù)的開(kāi)始行之前,將待存儲(chǔ)至HBase數(shù)據(jù)庫(kù)的源數(shù)據(jù)轉(zhuǎn)換為字節(jié)數(shù)組;以及存儲(chǔ)單元,用于在HBase數(shù)據(jù)庫(kù)中存儲(chǔ)字節(jié)數(shù)組。
比如,源數(shù)據(jù)為字符串“abf20150306f”,將該字符串“abf20150306f”轉(zhuǎn)換成字節(jié)數(shù)組為[97,98,102,50,48,49,53,48,51,48,54,102];
源數(shù)據(jù)為字符串“abf20150307e”,將該字符串“abf20150307e”轉(zhuǎn)換成字節(jié)數(shù)組為[97,98,102,50,48,49,53,48,51,48,55,101];
源數(shù)據(jù)為字符串“abf20150308g”,將該字符串“abf20150308g”轉(zhuǎn)換成字節(jié)數(shù)組 為[97,98,102,50,48,49,53,48,51,48,56,103];
源數(shù)據(jù)為字符串“abg20150309c”,將該字符串“abg20150309c”轉(zhuǎn)換成字節(jié)數(shù)組為[97,98,103,50,48,49,53,48,51,48,57,99];
源數(shù)據(jù)為字符串“abg20150410n”,將該字符串“abg20150410n”轉(zhuǎn)換成字節(jié)數(shù)組為[97,98,103,50,48,49,53,48,52,49,48,110];
源數(shù)據(jù)為字符串“abg20150512m”,將該字符串“abg20150512m”轉(zhuǎn)換成字節(jié)數(shù)組為[97,98,103,50,48,49,53,48,53,49,50,109];
源數(shù)據(jù)為字符串“abg20150720n”,將該字符串“abg20150720n”轉(zhuǎn)換成字節(jié)數(shù)組為[97,98,103,50,48,49,53,48,55,50,48,110];
源數(shù)據(jù)為字符串“abh20150205c”,將該字符串“abh20150205c”轉(zhuǎn)換成字節(jié)數(shù)組為[97,98,104,50,48,49,53,48,50,48,53,99];
源數(shù)據(jù)為字符串“abh20150614r”,將該字符串“abh20150614r”轉(zhuǎn)換成字節(jié)數(shù)組為[97,98,104,50,48,49,53,48,54,49,52,114];
源數(shù)據(jù)為字符串“abi20150519h”,將該字符串“abi20150519h”轉(zhuǎn)換成字節(jié)數(shù)組為[97,98,105,50,48,49,53,48,53,49,57,104]。把轉(zhuǎn)換后的字節(jié)數(shù)組進(jìn)行存儲(chǔ)。
通過(guò)把源數(shù)據(jù)轉(zhuǎn)換成字節(jié)數(shù)組,達(dá)到便于計(jì)算機(jī)存儲(chǔ)的效果。
可選地,存儲(chǔ)單元包括:分組模塊,用于按照不同用戶的用戶標(biāo)識(shí)對(duì)轉(zhuǎn)換后的字節(jié)數(shù)組進(jìn)行分組,其中,具有相同用戶標(biāo)識(shí)的字節(jié)數(shù)組處于同一組內(nèi);以及存儲(chǔ)模塊,用于存儲(chǔ)分組后的字節(jié)數(shù)組。
有10條訪問(wèn)數(shù)據(jù),經(jīng)過(guò)轉(zhuǎn)換后的字節(jié)數(shù)組為:
[97,98,102,50,48,49,53,48,51,48,54,102]、
[97,98,102,50,48,49,53,48,51,48,55,101]、
[97,98,102,50,48,49,53,48,51,48,56,103]、
[97,98,103,50,48,49,53,48,51,48,57,99]、
[97,98,103,50,48,49,53,48,52,49,48,110]、
[97,98,103,50,48,49,53,48,53,49,50,109]、
[97,98,103,50,48,49,53,48,55,50,48,110]、
[97,98,104,50,48,49,53,48,50,48,53,99]、
[97,98,104,50,48,49,53,48,54,49,52,114]、
[97,98,105,50,48,49,53,48,53,49,57,104]。
以上10個(gè)字節(jié)數(shù)組存在4個(gè)不同的用戶標(biāo)識(shí),即這10個(gè)字節(jié)數(shù)組是4個(gè)用戶的訪問(wèn)數(shù)據(jù)轉(zhuǎn)后得到的。這4個(gè)不同的用戶標(biāo)識(shí)分別為[97,98,102]、[97,98,103]、[97,98,104]、[97,98,105]。
把具有相同用戶標(biāo)識(shí)的字節(jié)數(shù)組分到一組,例如,以上10個(gè)字節(jié)數(shù)組一共分成4組,其中,第1組包括3個(gè)字節(jié)數(shù)組,分別為:
[97,98,102,50,48,49,53,48,51,48,54,102]、
[97,98,102,50,48,49,53,48,51,48,55,101]、
[97,98,102,50,48,49,53,48,51,48,56,103];
第2組包括4個(gè)字節(jié)數(shù)組,分別為:
[97,98,103,50,48,49,53,48,51,48,57,99]、
[97,98,103,50,48,49,53,48,52,49,48,110]、
[97,98,103,50,48,49,53,48,53,49,50,109]、
[97,98,103,50,48,49,53,48,55,50,48,110];
第3組包括2個(gè)字節(jié)數(shù)組,分別為:
[97,98,104,50,48,49,53,48,50,48,53,99]、
[97,98,104,50,48,49,53,48,54,49,52,114];
第4組包括1個(gè)字節(jié)數(shù)組,為[97,98,105,50,48,49,53,48,53,49,57,104]。
通過(guò)把字節(jié)數(shù)組分組存儲(chǔ),使每一組的字節(jié)數(shù)組都是由某一用戶的源數(shù)據(jù)轉(zhuǎn)換而來(lái),達(dá)到了不同用戶數(shù)據(jù)分開(kāi)存儲(chǔ)的效果。
可選地,開(kāi)始行為待查詢數(shù)據(jù)的唯一標(biāo)識(shí)所處的行。
例如,要查詢用戶乙,用戶乙的唯一標(biāo)識(shí)是[97,98,103],則用戶乙的唯一標(biāo)識(shí)所處的行是[97,98,103,50,48,49,53,48,51,48,57,99],即這一行即為查詢的開(kāi)始行。
通過(guò)指定開(kāi)始行為待查詢數(shù)據(jù)的唯一標(biāo)識(shí)所處的行,不用再?gòu)念^掃描全表,達(dá)到 了提高掃描效率的效果。
可選地,計(jì)算單元包括:獲取模塊,用于獲取表示開(kāi)始行上的數(shù)據(jù)的第一字節(jié)數(shù)組;計(jì)算模塊,用于計(jì)算第一字節(jié)數(shù)組與預(yù)設(shè)字節(jié)的字節(jié)數(shù)組之和,得到第二字節(jié)數(shù)組;以及確定模塊,用于確定第二字節(jié)數(shù)組所表示的行為結(jié)束行。
可選地,預(yù)設(shè)字節(jié)為1。在本申請(qǐng)實(shí)施例中,表示預(yù)設(shè)字節(jié)的字節(jié)數(shù)組的行列結(jié)構(gòu)和第一字節(jié)數(shù)組的行列結(jié)構(gòu)相同,對(duì)于預(yù)設(shè)字節(jié)為1的情況,可以使用預(yù)設(shè)字節(jié)的字節(jié)數(shù)組中的首位元素為1、其它位元素為0來(lái)表示字節(jié)1,也可以使用預(yù)設(shè)字節(jié)的字節(jié)數(shù)組中的末位元素為1、其它位元素為0來(lái)表示字節(jié)1,還可以使用預(yù)設(shè)字節(jié)的字節(jié)數(shù)組中任一位置的元素為1、其它位的元素為0來(lái)表示字節(jié)1。在本申請(qǐng)實(shí)施例中,以使用預(yù)設(shè)字節(jié)的字節(jié)數(shù)組中的末位元素為1、其它位元素為0來(lái)表示字節(jié)1為例進(jìn)行具體介紹。
例如,開(kāi)始行為abg20150309c,則開(kāi)始行的字節(jié)數(shù)組為[97,98,103,50,48,49,53,48,51,48,57,99],開(kāi)始行的第一字節(jié)數(shù)組為[97,98,103]。預(yù)設(shè)字節(jié)可以取1,則表示預(yù)設(shè)字節(jié)1的字節(jié)數(shù)組可以為[0,0,1],第一字節(jié)數(shù)組與預(yù)設(shè)字節(jié)的字節(jié)數(shù)組之和為[97,98,104],即[97,98,104]為第二字節(jié)數(shù)組,那么[97,98,104,50,48,49,53,48,50,48,53,99]即為結(jié)束行。
通過(guò)確定結(jié)束行,使掃描在開(kāi)始行與結(jié)束行之間的范圍進(jìn)行,縮小了掃描范圍,提高了查詢效率。
上述本申請(qǐng)實(shí)施例序號(hào)僅僅為了描述,不代表實(shí)施例的優(yōu)劣。
在本申請(qǐng)的上述實(shí)施例中,對(duì)各個(gè)實(shí)施例的描述都各有側(cè)重,某個(gè)實(shí)施例中沒(méi)有詳述的部分,可以參見(jiàn)其他實(shí)施例的相關(guān)描述。
在本申請(qǐng)所提供的幾個(gè)實(shí)施例中,應(yīng)該理解到,所揭露的技術(shù)內(nèi)容,可通過(guò)其它的方式實(shí)現(xiàn)。其中,以上所描述的裝置實(shí)施例僅僅是示意性的,例如所述單元的劃分,可以為一種邏輯功能劃分,實(shí)際實(shí)現(xiàn)時(shí)可以有另外的劃分方式,例如多個(gè)單元或組件可以結(jié)合或者可以集成到另一個(gè)系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點(diǎn),所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過(guò)一些接口,單元或模塊的間接耦合或通信連接,可以是電性或其它的形式。
所述作為分離部件說(shuō)明的單元可以是或者也可以不是物理上分開(kāi)的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個(gè)地方,或者也可以分布到多個(gè)單元上。可以根據(jù)實(shí)際的需要選擇其中的部分或者全部單元來(lái)實(shí)現(xiàn)本實(shí)施例方案的目的。
另外,在本申請(qǐng)各個(gè)實(shí)施例中的各功能單元可以集成在一個(gè)處理單元中,也可以是各個(gè)單元單獨(dú)物理存在,也可以兩個(gè)或兩個(gè)以上單元集成在一個(gè)單元中。上述集成的單元既可以采用硬件的形式實(shí)現(xiàn),也可以采用軟件功能單元的形式實(shí)現(xiàn)。
所述集成的單元如果以軟件功能單元的形式實(shí)現(xiàn)并作為獨(dú)立的產(chǎn)品銷售或使用時(shí),可以存儲(chǔ)在一個(gè)計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中?;谶@樣的理解,本申請(qǐng)的技術(shù)方案本質(zhì)上或者說(shuō)對(duì)現(xiàn)有技術(shù)做出貢獻(xiàn)的部分或者該技術(shù)方案的全部或部分可以以軟件產(chǎn)品的形式體現(xiàn)出來(lái),該計(jì)算機(jī)軟件產(chǎn)品存儲(chǔ)在一個(gè)存儲(chǔ)介質(zhì)中,包括若干指令用以使得一臺(tái)計(jì)算機(jī)設(shè)備(可為個(gè)人計(jì)算機(jī)、服務(wù)器或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本申請(qǐng)各個(gè)實(shí)施例所述方法的全部或部分步驟。而前述的存儲(chǔ)介質(zhì)包括:U盤、只讀存儲(chǔ)器(ROM,Read-Only Memory)、隨機(jī)存取存儲(chǔ)器(RAM,Random Access Memory)、移動(dòng)硬盤、磁碟或者光盤等各種可以存儲(chǔ)程序代碼的介質(zhì)。
以上所述僅是本申請(qǐng)的優(yōu)選實(shí)施方式,應(yīng)當(dāng)指出,對(duì)于本技術(shù)領(lǐng)域的普通技術(shù)人員來(lái)說(shuō),在不脫離本申請(qǐng)?jiān)淼那疤嵯?,還可以做出若干改進(jìn)和潤(rùn)飾,這些改進(jìn)和潤(rùn)飾也應(yīng)視為本申請(qǐng)的保護(hù)范圍。