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

Nis*_*yal 35 hbase nosql

我想从hbase shell扫描HTable中的行,其中列族(即Tweet)具有特定值(即user_id).

现在我想查找tweet:user_id具有值的所有行,test1因为此列具有值'test1'

column=tweet:user_id, timestamp=1339581201187, value=test1
Run Code Online (Sandbox Code Playgroud)

虽然我可以扫描特定用途的表格,

scan 'tweetsTable',{COLUMNS => 'tweet:user_id'}
Run Code Online (Sandbox Code Playgroud)

但我没有找到任何方法来扫描行的值.

是否可以通过HBase Shell执行此操作?

我也检查了这个问题.

小智 45

没有Hive就有可能:

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

注意:为了查找包含test1作为问题中指定的值的所有行,请在过滤器中使用binaryprefix:test1(有关更多示例,请参阅此答案)

  • @utrecht:你能解释一下'binaryprefix:someValue'是什么意思吗?一个例子将给予更清晰, (8认同)

Rom*_*nko 23

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' }
Run Code Online (Sandbox Code Playgroud)

family:field应用过滤器返回列.可以改进该过滤器以执行更复杂的比较.

以下是我认为最有用的提示:


030*_*030 13

由于有多个请求来解释这个答案,这个额外的答案已经发布.

例1

如果

scan '<table>', { COLUMNS => '<column>', LIMIT => 3 }
Run Code Online (Sandbox Code Playgroud)

会回来:

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
Run Code Online (Sandbox Code Playgroud)

然后这个过滤器:

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

会回来:

ROW     COLUMN+CELL
ROW2    column=<column>, timestamp=<timestamp>, value=hello_value2
ROW3    column=<column>, timestamp=<timestamp>, value=hello_value3
Run Code Online (Sandbox Code Playgroud)

例2

如果不支持:

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

会回来:

ROW     COLUMN+CELL
ROW1    column=<column>, timestamp=<timestamp>, value=hello_value
ROW3    column=<column>, timestamp=<timestamp>, value=hello_value3
Run Code Online (Sandbox Code Playgroud)


小智 7

在表t1中使用列族d:a_content对值BIGBLUE进行文本搜索的示例.扫描表格将显示所有可用值: -

scan 't1'
...
column=d:a_content, timestamp=1404399246216, value=BIGBLUE
...
Run Code Online (Sandbox Code Playgroud)

要仅搜索限制为1的BIGBLUE值,请尝试以下命令: -

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

COLUMN+CELL
column=d:a_content, timestamp=1404399246216, value=BIGBLUE
Run Code Online (Sandbox Code Playgroud)

显然,删除限制将显示该表/ cf中的所有事件.