Accumulo で特定の列ファミリーを持たない行を見つける簡単な方法はありますか?
たとえば、単純なサンプル データを次に示します (タイムスタンプと可視性を省略しています)。
r|cf|cq|v
1|A | |
2|A | |
2|B | |
3|A | |
3|B | |
4|C | |
「B」列ファミリーのない行を探すスキャナーを作成したいと思います。この場合、行 1 と 4 が返されます。
Accumulo で特定の列ファミリーを持たない行を見つける簡単な方法はありますか?
たとえば、単純なサンプル データを次に示します (タイムスタンプと可視性を省略しています)。
r|cf|cq|v
1|A | |
2|A | |
2|B | |
3|A | |
3|B | |
4|C | |
「B」列ファミリーのない行を探すスキャナーを作成したいと思います。この場合、行 1 と 4 が返されます。
Accumulo で使用できる特定の API 呼び出しはありませんが、これは、Accumulo の (SortedKeyValue)Iterator の概念が優れている理由を示す良い例です。少量のコードを記述し、クライアントではなくサーバーでこのフィルタリングを実行できます。
あなたをぶら下げておくのではなく、ここにいくつかのコードがあります: https://github.com/joshelser/RowsWithoutColumns
具体的には、イテレータを見つけることができます: https://github.com/joshelser/RowsWithoutColumns/blob/master/src/main/java/accumulo/RowsWithoutColumnIterator.java
そして、それを呼び出すコード: https://github.com/joshelser/RowsWithoutColumns/blob/master/src/test/java/test/RowsWithoutColumnIteratorTest.java
注意すべき点がいくつかあります。RowsWithoutColumnIterator は、求めていることを達成するために行全体をメモリにバッファリングする必要があります。多くの列を持つ行がある場合、このアプローチではメモリ不足になります。行ごとに 1,000 列 (各キー値が 1KB) の場合、サーバーはメモリに 1MB を保持する必要があります。幅の広い列がない場合、これは問題になりません。この例も 1.5.0 に依存していますが、このコードはどのバージョンの Accumulo に対しても実行できます (テスト ケースでいくつかの API 呼び出しを変更した場合)。