38

我想从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 做到这一点?

我也检查了这个问题

4

7 回答 7

49

没有 Hive 是可能的:

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

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

于 2012-09-25T21:05:57.970 回答
28

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返回应用了过滤器的列。可以改进此过滤器以执行更复杂的比较。

这里还有一些我认为最有用的提示:

于 2013-10-03T10:15:58.920 回答
15

由于有多个要求解释此答案,因此已发布此附加答案。

示例 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
于 2016-04-12T22:30:58.567 回答
8

在表 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 中的所有事件。

于 2015-02-18T16:28:02.680 回答
1

要根据任何列值扫描 hbase 中的表,SingleColumnValueFilter 可以用作:

scan 'tablename' ,
   { 
     FILTER => "SingleColumnValueFilter('column_family','col_name',>, 'binary:1')" 
   } 
于 2013-12-17T12:55:40.187 回答
0

从 HBAse shell 我认为这是不可能的,因为它有点像我们使用的查询想要查找特定数据。我们都知道 HBAse 是 noSQL,所以当我们想要应用查询或者如果我们有像你这样的案例时,我认为你应该使用 Hive 或 PIG,因为 Hive 是安静的好方法,因为在 PIG 中我们需要弄乱脚本。无论如何,您可以从这里HIVE 与 HBase 的集成以及从这里
获得有关 hive 的良好指导 如果您的唯一目的是查看数据而不是从(任何客户端的)代码中获取,那么您可以使用 HBase Explorer 或一个新的非常好的产品,但是它在其 beta 版本中是“HBase manager”。您可以从HBase 管理器获取此信息

它很简单,更重要的是,它有助于插入和删除数据,像其他 DBclient 一样从 UI 中对列限定符应用过滤器。试试。
我希望它对你有帮助:)

于 2012-06-13T12:38:14.760 回答
0

略有不同的问题,但如果您想查询并非所有行中都存在的特定列,那么DependentColumnFilter您最好的朋友是:

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

先前的扫描将返回所有列,其中 lan列存在并且其关联值等于fre。第三个参数是dropDependentColumn并且如果设置为 ,将阻止lan列本身显示在结果中true

于 2020-10-07T19:51:13.200 回答