hbase過濾器
㈠ hbase 多條件查詢or 怎麼過濾掉不需要查的列
hbase的region是按行劃分,而非按列,如果你讀取指定一行的所有列數據,regionServer雖然無法保證你的回所有數據都在一個答HFile中,但是至少是在一個Region中。但是具體的HFile所在的hdfs的節點那就不是HBase關心的事了,因為HBase的存儲是依賴與hdfs,所以底層存儲讀取的事會由NameNode操心,NameNode會考慮就近原則,而提供最高效的數據讀取策略。
你的數據傳輸是必然,但是HBase不會計算,計算是發生在你將想要的數據獲取到之後再自行進行計算的。你讀取大量數據必然會有大量數據傳輸,HBase只是將提供了一種高效的數據讀取策略,盡量減小數據傳輸量
㈡ HBase scan setBatch和setCaching的區別
HBase的查詢實現只提供兩種方式:1、按指定RowKey獲取唯一一條記錄,get方法(org.apache.hadoop.hbase.client.Get)2、按指定的條件獲取一批記錄,scan方法(org.apache.hadoop.hbase.client.Scan)實現條件查詢功能使用的就是scan方式,scan在使用時有以下幾點值得注意:1、scan可以通過setCaching與setBatch方法提高速度(以空間換時間);2、scan可以通過setStartRow與setEndRow來限定范圍([start,end)start是閉區間,end是開區間)。范圍越小,性能越高。通過巧妙的RowKey設計使我們批量獲取記錄集合中的元素挨在一起(應該在同一個Region下),可以在遍歷結果時獲得很好的性能。3、scan可以通過setFilter方法添加過濾器,這也是分頁、多條件查詢的基礎。scan中的setCaching與setBatch方法的區別是什麼呢?setCaching設置的值為每次rpc的請求記錄數,默認是1;cache大可以優化性能,但是太大了會花費很長的時間進行一次傳輸。setBatch設置每次取的columnsize;有些row特別大,所以需要分開傳給client,就是一次傳一個row的幾個column。batch和caching和hbasetablecolumnsize共同決意了rpc的次數。
㈢ hbase過濾器里的bitcomparator怎麼用
HBase為篩選數據提供了一組過濾器,通過這個過濾器可以在HBase中的數據的多個維度(行,版列,數據版本權)上進行對數據的篩選操作,也就是說過濾器最終能夠篩選的數據能夠細化到具體的一個存儲單元格上(由行鍵,列明,時間戳定位)。
㈣ shell怎樣過濾掉hbase-site.xml文件中的注釋項
hbase接到命令後存下變化信息或者寫入失敗異常的拋出,默認情況下。執行寫入時會寫到兩個地方:預寫式日誌(write-ahead log,也稱hlog)和memstore,以保證數據持久化。memstore是內存里的寫入緩沖區。客戶端在寫的過程中不會與底層的hfile直接交互,當menstore寫滿時,會刷新到硬碟,生成一個新的hfile.hfile是hbase使用的底層存儲格式。menstore的大小由hbase-site.xml文件里的系統級屬性hbase.hregion.memstore.flush.size來定義。
hbase在讀操作上使用了lru緩存機制(blockcache),blockcache設計用來保存從hfile里讀入內存的頻繁訪問的數據,避免硬碟讀。每個列族都有自己的blockcache。blockcache中的block是hbase從硬碟完成一次讀取的數據單位。block是建立索引的最小數據單位,也是從硬碟讀取的最小數據單位。如果主要用於隨機查詢,小一點的block會好一些,但是會導致索引變大,消耗更多內存,如果主要執行順序掃描,大一點的block會好一些,block變大索引項變小,因此節省內存。
LRU是Least Recently Used 近期最少使用演算法。內存管理的一種頁面置換演算法,對於在內存中但又不用的數據塊(內存塊)叫做LRU,操作系統會根據哪些數據屬於LRU而將其移出內存而騰出空間來載入另外的數據。
㈤ hbase中怎麼用java來過濾欄位
hbase提供了ListFilter過濾Listfilters=newArraList();Filterf1=newRowFilter();Filterf2=newAualifierFilter(.);filters.add(f1);filters.add(f2);FilterListfilterList=newFilterList(filters);Scan
㈥ hbase的過濾器有哪些
HBase為篩選數據提供了一組過濾器,通過這個過濾器可以在HBase中的數據的多個維度(行,列,數據版本)上進行對數據的篩選操作,也就是說過濾器最終能夠篩選的數據能夠細化到具體的一個存儲單元格上(由行鍵,列明,時間戳定位)。通常來說,通過行鍵,值來篩選數據的應用場景較多。
1. RowFilter:篩選出匹配的所有的行,對於這個過濾器的應用場景,是非常直觀的:使用BinaryComparator可以篩選出具有某個行鍵的行,或者通過改變比較運算符(下面的例子中是CompareFilter.CompareOp.EQUAL)來篩選出符合某一條件的多條數據,以下就是篩選出行鍵為row1的一行數據:
[java]view plain
Filterrf=newRowFilter(CompareFilter.CompareOp.EQUAL,newBinaryComparator(Bytes.toBytes("row1")));//OK篩選出匹配的所有的行
- 2.PrefixFilter:篩選出具有特定前綴的行鍵的數據。這個過濾器所實現的功能其實也可以由RowFilter結合RegexComparator來實現,不過這里提供了一種簡便的使用方法,以下過濾器就是篩選出行鍵以row為前綴的所有的行:
Filterpf=newPrefixFilter(Bytes.toBytes("row"));//OK篩選匹配行鍵的前綴成功的行
- 3.KeyOnlyFilter:這個過濾器唯一的功能就是只返回每行的行鍵,值全部為空,這對於只關注於行鍵的應用場景來說非常合適,這樣忽略掉其值就可以減少傳遞到客戶端的數據量,能起到一定的優化作用:
Filterkof=newKeyOnlyFilter();//OK返回所有的行,但值全是空
- 4.RandomRowFilter:從名字上就可以看出其大概的用法,本過濾器的作用就是按照一定的幾率(<=0會過濾掉所有的行,>=1會包含所有的行)來返回隨機的結果集,對於同樣的數據集,多次使用同一個RandomRowFilter會返回不通的結果集,對於需要隨機抽取一部分數據的應用場景,可以使用此過濾器:
Filterrrf=newRandomRowFilter((float)0.8);//OK隨機選出一部分的行
- 5.InclusiveStopFilter:掃描的時候,我們可以設置一個開始行鍵和一個終止行鍵,默認情況下,這個行鍵的返回是前閉後開區間,即包含起始行,但不包含終止行,如果我們想要同時包含起始行和終止行,那麼我們可以使用此過濾器:
Filterisf=newInclusiveStopFilter(Bytes.toBytes("row1"));//OK包含了掃描的上限在結果之內
- 6.FirstKeyOnlyFilter:如果你只想返回的結果集中只包含第一列的數據,那麼這個過濾器能夠滿足你的要求。它在找到每行的第一列之後會停止掃描,從而使掃描的性能也得到了一定的提升:
Filterfkof=newFirstKeyOnlyFilter();//OK篩選出第一個每個第一個單元格
- 7.ColumnPrefixFilter:顧名思義,它是按照列名的前綴來篩選單元格的,如果我們想要對返回的列的前綴加以限制的話,可以使用這個過濾器:
Filtercpf=newColumnPrefixFilter(Bytes.toBytes("qual1"));//OK篩選出前綴匹配的列
- 8.ValueFilter:按照具體的值來篩選單元格的過濾器,這會把一行中值不能滿足的單元格過濾掉,如下面的構造器,對於每一行的一個列,如果其對應的值不包含ROW2_QUAL1,那麼這個列就不會返回給客戶端:
Filtervf=newValueFilter(CompareFilter.CompareOp.EQUAL,newSubstringComparator("ROW2_QUAL1"));//OK篩選某個(值的條件滿足的)特定的單元格
- 9.ColumnCountGetFilter:這個過濾器來返回每行最多返回多少列,並在遇到一行的列數超過我們所設置的限制值的時候,結束掃描操作:
Filterccf=newColumnCountGetFilter(2);//OK如果突然發現一行中的列數超過設定的最大值時,整個掃描操作會停止
- 10.SingleColumnValueFilter:用一列的值決定這一行的數據是否被過濾。在它的具體對象上,可以調用setFilterIfMissing(true)或者setFilterIfMissing(false),默認的值是false,其作用是,對於咱們要使用作為條件的列,如果這一列本身就不存在,那麼如果為true,這樣的行將會被過濾掉,如果為false,這樣的行會包含在結果集中。
SingleColumnValueFilterscvf=newSingleColumnValueFilter(
Bytes.toBytes("colfam1"),
Bytes.toBytes("qual2"),
CompareFilter.CompareOp.NOT_EQUAL,
newSubstringComparator("BOGUS"));
scvf.setFilterIfMissing(false);
scvf.setLatestVersionOnly(true);//OK
- 11.:這個與10種的過濾器唯一的區別就是,作為篩選條件的列的不會包含在返回的結果中。
Filterskf=newSkipFilter(vf);//OK發現某一行中的一列需要過濾時,整個行就會被過濾掉
- 13.WhileMatchFilter:這個過濾器的應用場景也很簡單,如果你想要在遇到某種條件數據之前的數據時,就可以使用這個過濾器;當遇到不符合設定條件的數據的時候,整個掃描也就結束了:
Filterwmf=newWhileMatchFilter(rf);//OK類似於Pythonitertools中的takewhile
- 14.FilterList:用於綜合使用多個過濾器。其有兩種關系:FilterList.Operator.MUST_PASS_ONE和FilterList.Operator.MUST_PASS_ALL,默認的是FilterList.Operator.MUST_PASS_ALL,顧名思義,它們分別是AND和OR的關系,並且FilterList可以嵌套使用FilterList,使我們能夠表達更多的需求:
List<Filter>filters=newArrayList<Filter>();
filters.add(rf);
filters.add(vf);
FilterListfl=newFilterList(FilterList.Operator.MUST_PASS_ALL,filters);//OK綜合使用多個過濾器,AND和OR兩種關系
[java]view plain
[java]view plain
[java]view plain
[java]view plain
[java]view plain
[java]view plain
[java]view plain
[java]view plain
[java]view plain
12.SkipFilter:這是一種附加過濾器,其與ValueFilter結合使用,如果發現一行中的某一列不符合條件,那麼整行就會被過濾掉:
[java]view plain
㈦ HBase自定義過濾器(filter)出錯的問題
圖呢??
自定義過濾器需要放在服務端重啟一下的
㈧ 如何使用python在hbase里進行模糊查詢
注意:正則的寫法可能不對,保證能過濾出數據,但是可能不會嚴格匹配,正則問題請自己解決;
#導入thrift和habse包
from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from hbase import Hbase
from hbase.ttypes import *
#此處可以修改地址和埠
host = '192.168.1.1'
#默認埠為9090
port = 9090
#要查詢的表名
table = 'table_name'
#定義一個過濾器,此為關鍵步驟
filter = "RowFilter(=,'regexstring:.3333.')" #此行原創:)
# Make socket
transport = TSocket.TSocket(host, port)
# Buffering is critical. Raw sockets are very slow
# 還可以用TFramedTransport,也是高效傳輸方式
transport = TTransport.TBufferedTransport(transport)
# Wrap in a protocol
#傳輸協議和傳輸過程是分離的,可以支持多協議
protocol = TBinaryProtocol.TBinaryProtocol(transport)
#客戶端代表一個用戶
client = Hbase.Client(protocol)
#打開連接
try:
transport.open()
scan.filterString=filter
scanner = client.scannerOpenWithScan(table, scan)
except Exception:
finally:
client.scannerClose(scan)
transport.close()
㈨ hbase模糊查詢
哈哈哈,抄恰好我也在做一個類似的問題;hbase權威指南133頁,關於rowkey有一個內建的過濾器:
Scan scan = new Scan();
Filter filter = new RowFilter(CompareOp.EQUAL,new RegexStringComparator(".*京Q00"));
scan.setFilter(filter);
ResultScanner scanner;
try {
scanner = table.getScanner(scan);
for(Result res:scanner)
{
System.out.println(res);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
上面這段代碼應該能夠解決你的問題啦,enjoy it.
㈩ 求教:怎樣用hbase過濾器實現,一個列多列值
HBase為篩選數據提供了來一組源過濾器,通過這個過濾器可以在HBase中的數據的多個維度(行,列,數據版本)上進行對數據的篩選操作,也就是說過濾器最終能夠篩選的數據能夠細化到具體的一個存儲單元格上(由行鍵,列明,時間戳定位)。