簡體   English   中英

使用 HBase shell 掃描特定列值的 HTable 行

[英]Scan HTable rows for specific column value using HBase shell

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

現在我想找到 tweet:user_id 具有值test1所有行,因為該列具有值'test1'

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

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

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

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

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

我也檢查了這個問題

沒有 Hive 也是可能的:

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

注意:為了找到包含test1作為問題中指定的值的所有行,請在過濾器中使用binaryprefix:test1 (有關更多示例,請參閱此答案

Nishu,這是我定期使用的解決方案。 它實際上比您現在需要的要強大得多,但我認為有一天您會使用它的功能。 是的,它適用於 HBase shell。

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列並應用過濾器。 可以改進此過濾器以執行更復雜的比較。

這里還有一些我認為最有用的提示:

由於有多個要求解釋此答案,因此已發布此附加答案。

示例 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

文本搜索表 t1 中值 BIGBLUE 的示例,列族為 d:a_content。 掃描表格將顯示所有可用值:-

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

要僅搜索限制為 1 的 BIGBLUE 值,請嘗試以下命令:-

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

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

顯然,刪除限制將顯示該表/cf 中的所有事件。

要根據任何列值掃描 hbase 中的表,可以將 SingleColumnValueFilter 用作:

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

從 HBase shell 我認為這是不可能的,因為它是我們用來查找特定數據的查詢。 眾所周知,HBAse 是 noSQL,所以當我們想要應用查詢時,或者如果我們有像您這樣的情況,那么我認為您應該使用 Hive 或 PIG,因為 Hive 是一種安靜的好方法,因為在 PIG 中我們需要弄亂腳本。
無論如何,您可以從這里獲得有關HIVE 的良好指導, HIVE 與 HBase 的集成以及從這里
如果您的唯一目的是查看數據而不是從(任何客戶端的)代碼中獲取,那么您可以使用 HBase Explorer 或一個新的非常好的產品,但它的 beta 版本是“HBase 管理器”。 您可以從HBase 管理器獲取此信息
它很簡單,更重要的是,它有助於插入和刪除數據,像其他 DBclients 一樣從 UI 對列限定符應用過濾器。 試試。
我希望它對你有幫助:)

稍微不同的問題,但如果您想查詢不存在於所有行中的特定列, DependentColumnFilter是您最好的朋友:

import org.apache.hadoop.hbase.filter.DependentColumnFilter
scan 'orgtable2', {FILTER => "DependentColumnFilter('cf1','lan',false,=,'binary:fre')"}

前一次掃描將返回lan列所在行且其關聯值等於fre所有列。 第三個參數是dropDependentColumn ,如果設置為true ,它將阻止lan列本身顯示在結果中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM