第6章 HBase 過濾器的基本使用_第1頁
第6章 HBase 過濾器的基本使用_第2頁
第6章 HBase 過濾器的基本使用_第3頁
第6章 HBase 過濾器的基本使用_第4頁
第6章 HBase 過濾器的基本使用_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

過濾器的基本使用第6章學(xué)習(xí)目標(biāo)1.了解Hbase中內(nèi)置過濾器2.了解布隆過濾器的原理HBaseContents目錄過濾器介紹1常見過濾器使用2布隆過濾器36.1

過濾器介紹HBase的基本API,包括增、刪、改、查等。增、刪都是相對簡單的操作,與傳統(tǒng)數(shù)據(jù)庫相比,這里的查詢操作略顯蒼白,只能根據(jù)指定行鍵進(jìn)行查詢(Get)或者根據(jù)行鍵的范圍來查詢(Scan)。HBase不僅提供了這些簡單的查詢,而且提供了更加高級的過濾器(Filter)來查詢。6.1過濾器介紹常見過濾器介紹列值過濾器(valueFilter)根據(jù)條件進(jìn)行全表掃描(每一個cell)。邏輯可能不符合查詢需求。單列值過濾器(SingleColumnValueFilter)系統(tǒng)設(shè)置好的列值專用過濾器,可以指定一個列進(jìn)行數(shù)據(jù)過濾。行鍵過濾器(RowFilter)針對RowKey進(jìn)行過濾,效率較高。行鍵前綴過濾器(PrefixFilter)系統(tǒng)設(shè)置好的行鍵專用過濾器,可以對RowKey進(jìn)行模糊匹配。效率最高,使用廣泛。列值過濾器

//創(chuàng)建二進(jìn)制比較器,用于過濾器實(shí)現(xiàn)過濾規(guī)則使用

BinaryComparatorbinaryComparator=newBinaryComparator("23".getBytes());//列值過濾器,GREATER(大于):比較邏輯,過濾出大于23的數(shù)據(jù)

ValueFiltervalueFilter=newValueFilter(CompareFilter.CompareOp.GREATER,binaryComparator);//對掃描結(jié)果使用過濾器

printRSWithFilter(valueFilter);6.2常見過濾器使用6.2常見過濾器使用只要是一行的某個cell滿足條件,這一行就會被過濾出來所以結(jié)果可能未必是需要的,使用場景比較少單列值過濾器//指定info列族中的的age列,過濾出大于23的數(shù)據(jù)SingleColumnValueFiltersingleColumnValueFilter=newSingleColumnValueFilter("info".getBytes(),"age".getBytes(),CompareFilter.CompareOp.GREATER,"23".getBytes());printRSWithFilter(singleColumnValueFilter);6.2常見過濾器使用6.2常見過濾器使用針對age這一列進(jìn)行過濾可以得到正確的結(jié)果行鍵過濾器//創(chuàng)建二進(jìn)制比較器,用于過濾器實(shí)現(xiàn)過濾規(guī)則使用BinaryPrefixComparatorbinaryPrefixComparator =newBinaryPrefixComparator("1500100880".getBytes());//過濾出RowKey中,值大于“1500100880”的數(shù)據(jù)RowFilterrowFilter =newRowFilter(CompareFilter.CompareOp.GREATER,binaryPrefixComparator);printRSWithFilter(rowFilter);6.2常見過濾器使用6.2常見過濾器使用針對rowkey進(jìn)行過濾效率比對列過濾要高行鍵前綴過濾器//模糊匹配,過濾出以150010088作為起始RowKey的信息PrefixFilterprefixFilter=newPrefixFilter("150010088".getBytes());printRSWithFilter(prefixFilter);6.2常見過濾器使用6.2常見過濾器使用針對rowkey進(jìn)行前綴過濾,只能針對前綴進(jìn)處理,不能做到比較大小等操作,使用范圍比行鍵過濾器小一些但是效率最高組合使用過濾器//過濾出gender為男,age>23,理科班的學(xué)生

//第一個過濾器,過濾gande為男SingleColumnValueFilterfilter1=newSingleColumnValueFilter("info".getBytes(),"gender".getBytes(),CompareFilter.CompareOp.EQUAL,"男".getBytes());//第二個過濾器,過濾age>23SingleColumnValueFilterfilter2=newSingleColumnValueFilter("info".getBytes(),"age".getBytes(),CompareFilter.CompareOp.GREATER,"23".getBytes());6.2常見過濾器使用//過濾出clazz包含理科的SingleColumnValueFilterfilter3=newSingleColumnValueFilter("info".getBytes(),"clazz".getBytes(),CompareFilter.CompareOp.EQUAL,newBinaryPrefixComparator("理科".getBytes()));//組合過濾器FilterListfilterList=newFilterList();filterList.addFilter(filter1);filterList.addFilter(filter2);filterList.addFilter(filter3);printRSWithFilter(filterList);6.2常見過濾器使用6.2常見過濾器使用組合后,可以靈活的針對多列進(jìn)行過濾6.3布隆過濾器

BloomFilter(布隆過濾器)是1970年由布隆提出的。它實(shí)際上是一個很長的二進(jìn)制向量和一系列隨機(jī)映射函數(shù)。布隆過濾器可以用于檢索一個元素是否在一個集合中,他可以準(zhǔn)確判斷出這個元素是否一定不在該集合中。它的優(yōu)點(diǎn)是空間效率和查詢時間都遠(yuǎn)遠(yuǎn)超過一般的算法,缺點(diǎn)是有一定的誤識別率和刪除困難。我們拿個HBase中應(yīng)用的例子來說下,我們已經(jīng)知道rowKey存放在哪個region中,為了判斷哪個Hfile里面有需要的rowkey,我們就可以通過BloomFilter快速判斷,從而過濾掉大部分的HFile,減少需要掃描的Block。6.3布隆過濾器在此簡單地介紹一下BloomFilter的工作原理,BloomFilter使用位數(shù)組來實(shí)現(xiàn)過濾,初始狀態(tài)下位數(shù)組每一位都為0(false),如下圖所示:6.3布隆過濾器假如此時有一個集合S={x,y,…},BloomFilter使用n個獨(dú)立的hash函數(shù),分別將集合中的每一個元素映射到{1,…,m}的范圍。對于任何一個元素,被映射到的數(shù)字作為對應(yīng)的位數(shù)組的索引,該位會被置為1(true)。下圖中集合S有兩個元素x和y,分別被3個hash函數(shù)進(jìn)行映射,映射到的位置分別為(0,3,6)和(4,7,10),對應(yīng)的位會被置為1(true):6.3布隆過濾器現(xiàn)在假如要判斷另一個元素是否是在此集合中,只需要被這3個hash函數(shù)進(jìn)行映射,查看對應(yīng)的位置是否有0(false)存在,如果有的話,表示此元素肯定不存在于這個集合,否則有可能存在。下圖所示就表示z肯定不在集合{x,y}中:布隆過濾器的代碼簡單實(shí)現(xiàn)(部分重要代碼,完整代碼在試驗(yàn)手冊)privateintsize;//大小(位數(shù)組長度),數(shù)組越長占用越多,越準(zhǔn)確

privateBitSetbitSet;//生成二進(jìn)位數(shù)組

privateinthashFunctions;//哈希函數(shù)個數(shù),多次計算hash值,可以提高準(zhǔn)確率

//添加元素

publicvoidadd(Stringelement){//根據(jù)哈希函數(shù)個數(shù)循環(huán)多次計算

for(inti=0;i<hashFunctions;i++){//帶上次數(shù)計算hash值

inthash=hash(element,i);//將二進(jìn)制位數(shù)組的值改為truebitSet.set(hash,true);}}6.3布隆過濾器//哈希函數(shù)

privateinthash(Stringelement,intseed){inthash=0;//加上次數(shù)計算哈希值

for(inti=0;i<element.length();i++){hash=seed*hash+element.charAt(i);}returnMath.abs(hash)%size;}6.3布隆過濾器//查詢元素是否可能存在于集合中

publicStringcontains(Stringelement){for(inti=0;i<hashFunctions;i++){//帶上計算hash值

inthash=hash(element,i);//如果匹配失敗,位數(shù)據(jù)對不上,說明不在

if(!bitSet.get(hash)){return"數(shù)"+element+"據(jù)不在此處";}}//否則就是可能存在

return"數(shù)據(jù)"+element+"可能在此處";}

//初始化布隆過濾器

simpleBloomFilterbloomFilter=newsimpleBloomFilter(8,3);//插入幾條數(shù)據(jù)

bloomFilter.add("apple");bloomFilter.add("orange");bloomFilter.add("banana");bloomFilter.add("grape");//打印結(jié)果

System.out.println(bloomFilter.contains("apple"));//可能在此處

System.out.println(bloomFilter.c

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論