如何使用RegEx过滤Scan on Accumulo

时间:2013-01-16 18:29:54

标签: regex accumulo

我之前使用扫描存储在Accumulo中的数据,并且已经获得了整个结果集(无论我指定的Range)。问题是,我想在客户端接收之前从Accumulo过滤服务器端的那些。我希望有人有一个简单的代码示例,说明如何完成。

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

我找不到任何简单方法的在线代码示例,根据任何数据上的正则表达式过滤扫描,虽然我认为这应该是相对容易做的事情

1 个答案:

答案 0 :(得分:9)

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构造函数的前两个参数(优先级和名称)不相关。添加上述代码后,遍历扫描程序只会返回与正则表达式参数匹配的键/值对。