我以前使用过对存储在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参数匹配的键/值对。