我想从 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。
答案 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 HBase和Here获得关于蜂巢的良好保证
如果您的目的只是查看数据不是从代码(任何客户端)获取,那么您可以使用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
列本身在结果中显示。