使用扫描过滤器

基本上,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 列表作为参数