如何使用RegEx过滤累加扫描



我以前使用过对存储在Accumulo中的数据进行扫描,并且已经获得了整个结果集(无论我指定的Range是什么)。问题是,我想在客户端接收到Accumulo之前从服务器端过滤掉它们。我希望有人有一个简单的代码示例,如何做到这一点。

根据我的理解,Filter提供了一些(全部?)这个功能,但是在使用API的实践中是如何使用的呢?我在shell客户端上看到了一个使用Filter的示例,来自这里的Accumulo文档:http://accumulo.apache.org/user_manual_1.3-incubating/examples/filter.html

我在网上找不到一个简单的方法来过滤基于任何数据的正则表达式扫描的代码示例,尽管我认为这应该是相对容易做的事情。

Filter类为您想要的功能奠定了框架。要创建自定义过滤器,需要扩展Filter并实现accept(Key k, Value v)方法。如果您只希望基于正则表达式进行筛选,则可以使用RegExFilter来避免编写自己的筛选器。

使用RegExFilter很简单。下面是一个例子:

//first connect to Accumulo
ZooKeeperInstance inst = new ZooKeeperInstance(instanceName, zooServers);
Connector connect = inst.getConnector(user, password);
//initialize a scanner
Scanner scan = connect.createScanner(myTableName, myAuthorizations);
//to use a filter, which is an iterator, you must create an IteratorSetting
//specifying which iterator class you are using
IteratorSetting iter = new IteratorSetting(15, "myFilter", RegExFilter.class);
//next set the regular expressions to match. Here, I want all key/value pairs in
//which the column family begins with "J"
String rowRegex = null;
String colfRegex = "J.*";
String colqRegex = null;
String valueRegex = null;
boolean orFields = false;
RegExFilter.setRegexs(iter, rowRegex, colfRegex, colqRegex, valueRegex, orFields);
//now add the iterator to the scanner, and you're all set
scan.addScanIterator(iter);

iteratorSetting构造函数的前两个参数(优先级和名称)在这种情况下是不相关的。一旦添加了上述代码,遍历扫描器将只返回与regex参数匹配的键/值对。

相关内容

  • 没有找到相关文章

最新更新