複数のHBaseテーブルがあります。それらはすべて異なる方法でキーイングされますが、すべてのキーは32ビットの整数オーナIDをキーの一部として持っています。それはテーブルごとに異なってオフセットされますが、私はこれらのオフセットを知っています。 今、私はIDのコレクションに渡され、渡された所有者に関するデータをファイルにダンプする必要があります。私。私は、次のSQL文と同じ何かをする必要があります。意図したとおりにそれが機能していない登場JavaのHBaseテーブルのカスタムフィルタリング
public class SubKeyComparator extends BinaryComparator {
private Set<Integer> idSet;
private int idLength = 4;
private int idOffset = 0;
// getters/setters are here
@Override
public int compareTo(byte[] value) {
return idSet.contains(Bytes.toInt(value, offset, length))? 0 : 1;
}
}
:
SELECT * FROM table WHERE substr(key_field, offset, length) IN (...);
は、私がこのような何かを書かれていることを達成しようとしています。 実際には全く動作しません。私は、テーブルを開いていると私は
ResultScanner scanner = htable.getScanner(scan);
を取得しようとしていたときにそれは少し待ってから 組織でjava.io.EOFExceptionsのダースを示すorg.apache.hadoop.hbase.client.RetriesExhaustedExceptionをスローします.apache.hadoop.hbase.client.HConnectionManager $ HConnectionImplementation.getRegionServerWithRetries(HConnectionManager.java:1231)
Web上で解決策を見つけたり、HBaseのソースコードの何が間違っているかを理解しようとすると、大きな結果が得られませんでした。 フィルタをスキャンオブジェクトに挿入しないと、すべて正常に動作します。
誰かが間違っていることを知っていたり、似たようなことをしていると、あなたの助けに感謝します。
これを有効にしても、所有者IDがキーの一番左の部分ではないテーブル内のすべての行を処理することは非常に効率が悪いことにご注意ください。 –
はい、わかります。残念ながら、それでもやる必要があります。 – Gary