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

时间:2012-06-13 10:43:29

标签: nosql hbase

我想从 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执行此操作?

我也检查了this question

7 个答案:

答案 0 :(得分:43)

没有Hive就可以了:

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

注意:要查找包含 test1 的所有行作为问题中指定的值,请在过滤器中使用 binaryprefix:test1 (请参阅this answer更多例子)

答案 1 :(得分:22)

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

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

答案 2 :(得分:12)

由于有多个请求解释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

答案 3 :(得分:6)

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

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。

中的所有事件

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

从HBAse shell我认为这是不可能的,因为它与我们使用的查询有点像想要查找spsecific数据。因为我们都知道HBAse是noSQL,所以当我们想要应用查询或者我们有一个像你这样的情况时,我认为你应该使用Hive或PIG,而Hive是安静的好方法,因为在PIG中我们需要弄乱脚本。登记/> 无论如何,你可以从这里HIVE integration with HBaseHere获得关于蜂巢的良好保证 如果您的目的只是查看数据不是从代码(任何客户端)获取,那么您可以使用HBase Explorer或一个新的非常好的产品,但它的beta版本是“HBase manager”。您可以从HBase Manager获得此信息 它很简单,更重要的是,它有助于插入和删除数据,在UI上对列限定符应用过滤器,就像其他DBclients一样。试试。
我希望它对你有所帮助:)

答案 6 :(得分:0)

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

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

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