如何根据两列的范围查询 HBase?
Posted
技术标签:
【中文标题】如何根据两列的范围查询 HBase?【英文标题】:How to query HBase based on two columns' ranges? 【发布时间】:2017-08-21 03:35:54 【问题描述】:我有一个 HBase 表,其架构如下:
行键,col1,col2,col3
我想根据两列的范围查询表,比如:
1000
我该怎么做?我注意到 Java API 提供了 MultiRowRangeFilter 只能过滤一列,但我想根据范围过滤两列。有人有什么想法吗?提前谢谢你。
【问题讨论】:
您希望通过 1 个行键和 1 列而不是 2 列进行查询。不是吗? 是的,我想通过 1 个行键和 1 个另一列进行查询。有什么想法吗? 【参考方案1】:按1行键范围和1列范围查询时,MultiRowRangeFilter
不适用,因为它是为了过滤多个行键范围,比如
100 < rowKey < 200 AND 1500 < rowKey < 2000
您想在行键上使用Scan
,FilterList
为 2 SingleColumnValueFilter
。
byte[] keyStart = Bytes.toBytes(1000);
byte[] keyEnd = Bytes.toBytes(1000000);
byte[] columnMin = Bytes.toBytes(200);
byte[] columnMax = Bytes.toBytes(300);
byte[] cf = Bytes.toBytes(familyName)
byte[] column = Bytes.toBytes(columnNameToBeFiltered)
Scan scan = new Scan(keyStart, keyEnd);
FilterList list = new FilterList(FilterList.Operator.MUST_PASS_ALL);
SingleColumnValueFilter filter1 = new SingleColumnValueFilter(
cf, column, CompareOp.GREATER, columnMin);
list.add(filter1);
SingleColumnValueFilter filter2 = new SingleColumnValueFilter(
cf, column, CompareOp.LESS, columnMax);
list.add(filter2);
scan.setFilter(list);
ResultScanner scanner = table.getScanner(scan);
...//parsing result
【讨论】:
非常感谢您的回复! Scan() 中提供的两个参数是否正在对行键执行查询?我必须明确指定行键吗?谢谢。 是的。我正在使用 hbase-client 版本 1.2.4。它提供Scan(byte[] startRow, byte[] stopRow)
构造函数。您不必指定其他任何内容。应该看看 API 文档 hbase.apache.org/1.2/apidocs/org/apache/hadoop/hbase/client/…以上是关于如何根据两列的范围查询 HBase?的主要内容,如果未能解决你的问题,请参考以下文章