使用扫描过滤器
基本上,Scan 对象从表中检索所有行,但是如果只想检索给定列的值等于某些行的行,该怎么办?让我向你介绍过滤器,它们的工作方式类似于 SQL 中的 WHERE 。
在开始使用过滤器之前,如果你知道如何存储 row_keys ,则可以为扫描设置起始行和结束行,这将优化你的查询。
在 HBase 中, row_keys 存储在字典顺序中,但你仍然可以使用 salting 来改变它的存储方式,我不会在这个主题中解释 salting,这将花费太长时间而且不是重点。
让我们回到行边界,你有两种方法可以用来设置起始行和结束行
Scan scan = new Scan();
scan.setStartRow(Bytes.toBytes("row_10"));
scan.setStopRow(Bytes.toBytes("row_42"));
这将改变你的扫描仪行为以获取“row_10”和“row_42”之间的所有行。
注意 :与大多数子方法(例如 substring)一样,startRow 是包含的,stopRow 是独占的。
既然我们可以绑定扫描,我们现在应该为扫描添加一些过滤器,其中有很多,但我们会在这里看到最重要的过滤器。
- 如果要检索具有以给定模式开头的 row_key 的所有行
使用 RowPrefixFilter
:
Scan scan = new Scan();
scan.setRowPrefixFilter(Bytes.toBytes("hello"));
使用此代码,你的扫描将仅检索具有以 hello
开头的 row_key 的行。
- 如果要检索给定列的值等于某些内容的所有行
使用 SingleColumnValueFilter
:
Scan scan = new Scan();
SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("myFamily"),Bytes.toBytes("myColumn"), CompareOp.EQUAL, Bytes.toBytes("42"));
scan.setFilter(filter);
使用此代码,你将获得 myColumn 列的值等于 42 的所有行。你可以在参数部分中解释 CompareOp
的不同值。
- 好,但如果我想使用正则表达式怎么办?
使用 RegexStringComparator
过滤器:
Scan scan = new Scan();
RegexStringComparator comparator = new RegexStringComparator(".hello.");
SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("myFamily"),Bytes.toBytes("myColumn"), CompareOp.EQUAL, comparator);
scan.setFilter(filter);
并且你将获得 myColumn 列包含 hello 的所有行。
另请注意,方法 Scan.setFilter()
也可以将 Filter
列表作为参数