Nosql 使用HBase外壳扫描HTable行中的特定列值

Nosql 使用HBase外壳扫描HTable行中的特定列值,nosql,hbase,Nosql,Hbase,我想扫描HTable fromhbase shell中的行,其中列族(即Tweet)具有特定值(即用户id) 现在我想找到tweet:user_id有值的所有行test1,因为该列有值'test1' column=tweet:user_id, timestamp=1339581201187, value=test1 虽然我可以扫描表格中的特定用途 scan 'tweetsTable',{COLUMNS => 'tweet:user_id'} 但我没有找到任何方法来扫描一行以查找值 是否

我想扫描HTable fromhbase shell中的行,其中列族(即Tweet)具有特定值(即用户id)

现在我想找到tweet:user_id有值的所有行
test1
,因为该列有值
'test1'

column=tweet:user_id, timestamp=1339581201187, value=test1
虽然我可以扫描表格中的特定用途

scan 'tweetsTable',{COLUMNS => 'tweet:user_id'}
但我没有找到任何方法来扫描一行以查找值

是否可以通过HBase外壳执行此操作


我也检查过了。

来自HBAse shell,我认为这是不可能的,因为我们使用的是类似于查询的方式,希望从中查找特定的数据。正如我们所知,HBAse是noSQL,所以当我们想要应用查询或如果我们有像您这样的案例时,我认为您应该使用Hive或PIG,因为Hive是一种非常好的方法,因为在PIG中,我们需要处理脚本。
无论如何,您可以从这里和
获得有关蜂巢的良好信息 如果您的唯一目的是查看数据,而不是从(任何客户端的)代码中获取数据,那么您可以使用HBase Explorer或新的非常好的产品,但它的beta版是“HBase manager”。您可以从
获取此信息 它很简单,而且更重要的是,它有助于插入和删除数据,像其他DBClient一样,在UI中的列限定符上应用过滤器。试试

我希望它能对您有所帮助:)

没有蜂箱也可以:

scan 'filemetadata', 
     { COLUMNS => 'colFam:colQualifier', 
       LIMIT => 10, 
       FILTER => "ValueFilter( =, 'binaryprefix:<someValue.e.g. test1 AsDefinedInQuestion>' )" 
     }
扫描“文件元数据”,
{COLUMNS=>'colFam:colQualifier',
极限=>10,
FILTER=>“ValueFilter=,'binaryprefix:'”
}
注意:为了找到所有包含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
列在应用过滤器的情况下返回。可以改进此过滤器以执行更复杂的比较

这也是我认为最有用的提示:

  • -行内扫描解释(Java API)
  • -JavaDoc for FilterBase类,带有指向子体的链接,这些子体实际上可以使用相同的样式。好的,shell语法将略有不同,但有了上面的示例,您可以使用它

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

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

表t1中具有d:a\U内容列族的值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.

,因为有多个请求解释已发布的额外答案

示例1

如果

扫描“”,{COLUMNS=>'',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
ROW     COLUMN+CELL
ROW2    column=<column>, timestamp=<timestamp>, value=hello_value2
ROW3    column=<column>, timestamp=<timestamp>, value=hello_value3
ROW     COLUMN+CELL
ROW1    column=<column>, timestamp=<timestamp>, value=hello_value
ROW3    column=<column>, timestamp=<timestamp>, value=hello_value3
行-列+单元格
行1列=,时间戳=,值=hello\u值
行2列=,时间戳=,值=hello\u值2
行3列=,时间戳=,值=hello\u值3
然后此过滤器:

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

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
ROW     COLUMN+CELL
ROW2    column=<column>, timestamp=<timestamp>, value=hello_value2
ROW3    column=<column>, timestamp=<timestamp>, value=hello_value3
ROW     COLUMN+CELL
ROW1    column=<column>, timestamp=<timestamp>, value=hello_value
ROW3    column=<column>, timestamp=<timestamp>, value=hello_value3
行-列+单元格
行2列=,时间戳=,值=hello\u值2
行3列=,时间戳=,值=hello\u值3
示例2

如果不支持,请执行以下操作:

scan '<table>', { COLUMNS => '<column>', LIMIT => 3, FILTER => "ValueFilter( !=, 'binaryprefix:hello_value2' )" }
扫描“”,{COLUMNS=>'',LIMIT=>3,FILTER=>“ValueFilter(!=,'binaryprefix:hello_value2')”}
将返回:

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
ROW     COLUMN+CELL
ROW2    column=<column>, timestamp=<timestamp>, value=hello_value2
ROW3    column=<column>, timestamp=<timestamp>, value=hello_value3
ROW     COLUMN+CELL
ROW1    column=<column>, timestamp=<timestamp>, value=hello_value
ROW3    column=<column>, timestamp=<timestamp>, value=hello_value3
行-列+单元格
行1列=,时间戳=,值=hello\u值
行3列=,时间戳=,值=hello\u值3

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

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

上一次扫描将返回存在
lan
列且其关联值等于
fre
的行的所有列。第三个参数是
dropDependentColumn
,如果设置为
true

@utrecht,则会阻止
lan
列本身显示在结果中:您能解释一下“binaryprefix:someValue”的含义吗。一个例子将给出更清晰的解释,@Sudip7 Ok。我添加了。根据表的大小,通常返回结果的速度有多快。是否有不指定列限定符的选项?我需要使用值过滤器搜索数据。可能吗?您好,您是否实际运行了此命令(示例1)?这是错误的。它没有输出您提到的内容。当它在单个列值上检查
hello\u value2
hello\u value3
时,它输出0个结果,这显然不能同时满足这两个条件。@030我使用的是版本1.2.6。您在示例中的表上执行了这个命令吗?因为当与