2016-04-29 81 views
2

我想使用匹配某種模式的行從HBase shell中掃描HTable中的行。如何根據HBase shell中的行模式掃描行?

例如,我有以下表中的數據:

row:r1_t1 column:cf:a, timestamp=1461911995948,value=v1 
    row:r2_t2 column:cf:a, timestamp=1461911995949,value=v2 
    row:s1_t1 column:cf:a, timestamp=1461911995950,value=q1 
    row:s2_t2 column:cf:a, timestamp=1461911995951,value=q2 

基於上述數據,我想找到包含「T1」的行:

row:r1_t1 column:cf:a, timestamp=1461911995948,value=v1 
    row:s1_t1 column:cf:a, timestamp=1461911995950,value=q1 

我知道我可以掃描該表使用PrefixFilter,但此方法使用以指定篩選器開始的行。

scan 'test', {FILTER => "(PrefixFilter('s')"} 

是否有類似的方式掃描表的基礎上,過濾與行名中間的模式匹配的行的表?

+0

你找到比我下面提出其他任何替代技術? –

+0

不,使用RowFilter的方法工作正常,所以我停止尋找替代方法。 –

回答

2
hbase(main):003:0> scan 'test', {ENDROW => 't1'} 

一般而言,使用PrefixFilter可能是緩慢的,因爲它,直到它到達前綴執行表掃描。

也可以使用的RowFilter與SubstringComparator 像下面

可以使用RowFilterSubstringComparator像下面

hbase(main):003:0> import org.apache.hadoop.hbase.filter.CompareFilter 
hbase(main):005:0> import org.apache.hadoop.hbase.filter.SubstringComparator 
hbase(main):006:0> scan 'test', {FILTER => org.apache.hadoop.hbase.filter.RowFilter.new(CompareFilter::CompareOp.valueOf('EQUAL'),SubstringComparator.new("searchkeyword"))} 
+0

當我在大型表上使用這種方法時,我得到'錯誤:呼叫ID = 14,waitTime = 60001,operationTimeout = 60000過期。'有沒有增加waitTime的方法? –

+0

在hbase-site.xml中,你可以嘗試增加hbase.rpc.timeout到1800000 –

+0

我會引用你閱讀這個https://www.safaribooksonline.com/library/view/hbase-the-definitive/9781491905845/ch04。 html。一般來說,你的表中有大量的數據,並且你想要一些模式的搜索行,我會建議使用java api的FuzzyRowFilter(請參閱鏈接中的示例)它有2部分固定或已知部分rowkey和變量或未知部分關鍵這將有效地處理巨大的數據。 –