4

以前に Accumulo に保存されたデータに対してスキャンを使用し、結果セット全体を取得しました (Range指定したものは何でも)。問題は、クライアントがそれらを受信する前に、Accumulo からサーバー側でそれらをフィルタリングしたいということです。誰かがこれがどのように行われるかの簡単なコード例を持っていることを願っています.

私の理解でFilterは、この機能の一部 (すべて?) を提供していますが、これは API を使用して実際にどのように使用されていますか? ここの Accumulo ドキュメントから、シェル クライアントで Filter を使用する例を参照してください: http://accumulo.apache.org/user_manual_1.3-incubating/examples/filter.html

データの正規表現に基づいてスキャンをフィルタリングする簡単な方法のコード例をオンラインで見つけることができませんでしたが、これは比較的簡単に実行できるはずだと思います。

4

1 に答える 1

9

このFilterクラスは、必要な機能のフレームワークを構築します。Filterカスタム フィルターを作成するには、メソッドを拡張して実装する必要がありますaccept(Key k, Value v)。正規表現に基づいてフィルタリングすることのみを検討している場合は、RegExFilter.

a を使用するの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);

この場合、コンストラクターの最初の 2 つのパラメーターiteratorSetting(優先順位と名前) は関係ありません。上記のコードを追加すると、スキャナーを反復処理すると、正規表現パラメーターに一致するキーと値のペアのみが返されます。

于 2013-02-04T20:01:11.047 に答える