2012-06-13 47 views
31

我想從hbase shell中掃描HTable中的行,其中列族(即Tweet)具有特定值(即,user_id)。使用HBase shell掃描特定列值的HTable行

現在我想找個地方鳴叫的所有行:USER_ID具有價值test1作爲此列值'test1'

column=tweet:user_id, timestamp=1339581201187, value=test1 

雖然我可以使用掃描特定的表,

scan 'tweetsTable',{COLUMNS => 'tweet:user_id'} 

,但我沒有找到任何方式來掃描一行的值。

是否可以通過HBase Shell執行此操作?

我也檢查了this question

回答

36

有可能不蜂巢:

scan 'filemetadata', { COLUMNS => 'colFam:colQualifier', LIMIT => 10, FILTER => "ValueFilter(=, 'binaryprefix:<someValue.e.g. test1 AsDefinedInQuestion>')" } 

注:爲了查找包含test1的的值作爲一個問題中指定的所有行使用binaryprefix:TEST1在過濾器(參見this answer更多的例子)

+8

@utrecht:能否請您解釋一下是'binaryprefix:someValue'的意思。一個例子會給予更多的清晰度, – Sudip7

+0

@ Sudip7好的。我添加了[示例](http://stackoverflow.com/a/36585239/2777965)。 – 030

+0

取決於表的大小,通常返回結果的速度有多快。 – vbNewbie

0

從HBAse shell我認爲這是不可能的,因爲它是一些如何查詢我們使用的查找spsecific數據。正如我們所知道的,HBAse是noSQL,所以當我們想要應用查詢或者如果我們有像你這樣的情況,那麼我認爲你應該使用Hive或PIG,因爲在Hive中,我們需要混淆腳本。
無論如何,你可以從這裏獲得關於配置單元的好的方法HIVE integration with HBaseHere
如果您的目的只是查看不從代碼(任何客戶端)獲得的數據,那麼您可以使用HBase Explorer或一個新的非常好的產品,但它的beta版本是「HBase經理」。你可以從HBase Manager

得到它更簡單,更重要的是,它有助於插入和刪除數據,像其他DBclient一樣在UI上對列限定符應用過濾器。試試。
我希望這將是有益的你:)

21

Nishu, 這裏是溶液I定期使用。它實際上比你現在需要的功能強大得多,但我認爲你有一天會使用它的力量。是的,它適用於HBase外殼。

import org.apache.hadoop.hbase.filter.CompareFilter 
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter 
import org.apache.hadoop.hbase.filter.SubstringComparator 
import org.apache.hadoop.hbase.util.Bytes 

scan 'yourTable', {LIMIT => 10, FILTER => SingleColumnValueFilter.new(Bytes.toBytes('family'), Bytes.toBytes('field'), CompareFilter::CompareOp.valueOf('EQUAL'), Bytes.toBytes('AAA')), COLUMNS => 'family:field' } 

只有family:field列返回應用過濾器。可以改進此過濾器以執行更復雜的比較。

這裏同時提示你,我認爲最有用的:

+0

第二個鏈接似乎死了。你能否更新? –

1

要掃描表中的任何列的值的基礎上的HBase,SingleColumnValueFilter可以用作:

scan 'tablename' ,{ FILTER => "SingleColumnValueFilter('column_family','col_name',>, 'binary:1')" } 
5

文本搜索在表t1的值BIGBLUE用柱家族的一個例子d:a_content。表的掃描會顯示所有可用值: -

scan 't1' 
... 
column=d:content, timestamp=1404399246216, value=BIGBLUE 
... 

要搜索只是爲BIGBLUE與1極限數值: -

scan 't1',{ COLUMNS => 'd:a_content', LIMIT => 1, FILTER => "ValueFilter(=, 'regexstring:BIGBLUE')" } 

COLUMN+CELL 
column=d:a_content, timestamp=1404399246216, value=BIGBLUE 

顯然去除限制會顯示在所有出現那張桌子/ cf。

10

由於有多個請求來解釋this answer這個附加答案已經發布。

實施例1

如果

scan '<table>', { COLUMNS => '<column>', LIMIT => 3 } 

將返回:

ROW  COLUMN+CELL 
ROW1 column=<column>, timestamp=<timestamp>, value=hello_value 
ROW2 column=<column>, timestamp=<timestamp>, value=hello_value2 
ROW3 column=<column>, timestamp=<timestamp>, value=hello_value3 

然後這個濾波器:

scan '<table>', { COLUMNS => '<column>', LIMIT => 3, FILTER => "ValueFilter(=, 'binaryprefix:hello_value2') AND ValueFilter(=, 'binaryprefix:hello_value3')" } 

將返回:

ROW  COLUMN+CELL 
ROW2 column=<column>, timestamp=<timestamp>, value=hello_value2 
ROW3 column=<column>, timestamp=<timestamp>, value=hello_value3 

例2

如果不支持,以及:

scan '<table>', { COLUMNS => '<column>', LIMIT => 3, FILTER => "ValueFilter(!=, 'binaryprefix:hello_value2')" } 

將返回:

ROW  COLUMN+CELL 
ROW1 column=<column>, timestamp=<timestamp>, value=hello_value 
ROW3 column=<column>, timestamp=<timestamp>, value=hello_value3 
+0

是否有沒有指定列限定符的選項?我需要使用值過濾器來搜索數據。有可能嗎? – karthik

+0

嗨,你真的運行過這個命令嗎(例1)?這是錯誤的。它不輸出你提到的內容。它輸出0個結果,因爲它正在檢查單個列值上的'hello_value2'和'hello_value3',這顯然無法匹配這兩個條件。 – jayfah

+0

@ MZ2010它不起作用?你使用什麼hbase版本? – 030