1

カスタム イテレータを作成しようとしていますが、利用できるチュートリアルがないため、Accumulo github ページで提供されているコードを調べました。

そこで、すべてのクラスが SortedKeyValueIterator を実装し、その関数をオーバーライドすることがわかりました。

これらの関数の役割と、SortedKeyValueIterator を実装する新しいクラスを作成するときにこれらの関数をオーバーライドするときのアプローチは何ですか。

これは私が理解しようとしていた RowFilter クラスのサンプル コードです。

 public void init(SortedKeyValueIterator<Key,Value> source, Map<String,String> options, IteratorEnvironment env) throws IOException {
super.init(source, options, env);
this.decisionIterator = new RowIterator(source.deepCopy(env));
}

 public SortedKeyValueIterator<Key,Value> deepCopy(IteratorEnvironment env) {
 RowFilter newInstance;
 try {
       newInstance = getClass().newInstance();
     } catch (Exception e) 
      {
         throw new RuntimeException(e);
      }
  newInstance.setSource(getSource().deepCopy(env));
  newInstance.decisionIterator = new RowIterator(getSource().deepCopy(env));
  return newInstance;
   }

このコードが何をするのか、別のクラスに SortedKeyValueIterator を実装させたい場合、これらの関数をどのようにオーバーライドすればよいのかを知りたいです。

4

1 に答える 1

4

SortedKeyValueIterator の Javadoc ( http://accumulo.apache.org/1.6/apidocs/ ) を確認することから始めます。これは、各メソッドが行うべきことの出発点として適しています。

イテレータを記述する際の良い例えは、(イテレータが操作している) Accumulo テーブルを単一リンク リスト (ソート順) と考えることです。next() はリスト内の次のノードに移動し、 seek() は前方/下方に移動し、ゼロをスキップして多くのノードに移動します。init() は、Accumulo テーブル構成とクライアントの両方から必要な構成 (イテレーターはおそらく Accumulo サーバーで実行されています) を提供します。deepCopy() は、現在の反復子の正確な状態を新しいインスタンスに複製する必要があります (Object.clone() と同様)。

カスタム イテレータの例を 2 つ挙げることもできます。

  • https://github.com/joshelser/accumulo-column-summing/
    • 特定の列ファミリーで発生する数値の中間合計を実行します
    • クライアント側で最終的な合計が必要です
  • https://github.com/joshelser/RowsWithoutColumns
    • 指定された列のセットを含まない行のみを返します
    • WholeRowIterator シリアル化メソッドを使用して、複数のキーと値のペアを単一のキーと値のペアとして返します (クライアントで逆シリアル化が必要です)。

また、Accumulo http://accumulo.apache.org/1.6/apidocs/org/apache/accumulo/core/iterators/user/package-summary.htmlで提供されている他の「ユーザー向け」イテレーターを確認することもできます。

于 2015-01-07T21:24:03.207 に答える