如何根据两列的范围查询 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

您想在行键上使用ScanFilterList 为 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 VBA 在 Excel 宏中删除具有两列的重复项?

如何根据合并的数据框之一的两列的值在熊猫数据框中添加值

Bigquery:如何根据特定时间范围聚合几列的数据?

根据时间范围对用户活动进行分组的 SQL 查询

如何计算两列的平均值?微软访问

如何使用具有两列的 Hive sql 滞后函数?