3

特定の基準を満たすすべての行をスキャンするには、HBase で Scan を使用する必要があります。これが、フィルター (実際には 2 つの SingleColumnValueFilter を含む複合フィルター リスト) を使用する理由です。これで、rowKeys が次のように構造化されました。

a.b.x|1|1252525  
a.b.x|1|2373273  
a.b.x|1|2999238  
...  
a.b.x|2|3000320  
a.b.x|2|4000023  
...  
a.b.y|1|1202002  
a.b.y|1|1778949  
a.b.y|1|2738273  

追加の要件として、「abx|1」で始まるrowKeyを持つ行のみを反復処理する必要があります

さて、質問

  1. フィルタ リストで追加の PrefixFilter を使用すると、スキャナは常にすべての行をスキャンしますか (そして、それぞれにフィルタを適用しますか)?
  2. startRow (接頭辞) と filterlist (PrefixFilter なし) を渡して Scan をインスタンス化すると、指定された行の接頭辞からスキャンが開始されることがわかりました。それで、私が「abx」をstartRowとして使用していると仮定すると、スキャンはabyもスキャンしますか?
  3. new Scan(startRow, endRow) を使用してから setFilter を使用すると、どのような動作になりますか? つまり、欠落しているコンストラクタ Scan(byte [] start, byte [] end, Filter filter) はどうですか?

前もってありがとう
アンドレア

4

1 に答える 1

2

行キーは hbase でソート (字句) されます。したがって、すべての「abx|1」は「abx|2」などの前に来ます。行キーはバイト配列として格納され、辞書順でソートされるため、固定長でない行キーと混同する場合は注意してください。さまざまな文字クラス。しかし、あなたの要件では、この行の何かがうまくいくはずです:

Scan scan = new Scan(Bytes.toBytes("a.b.x|1"),Bytes.toBytes("a.b.x|2"); //creating a scan object with start and stop row keys

scan.setFilter(colFilter);//set the Column filters you have to this scan object.

//And then you can get a scanner object and iterate through your results
ResultScanner scanner = table.getScanner(scan);
for (Result result = scanner.next(); result != null; result = scanner.next())
{
    //Use the result object
}

更新: ToBytes は toBytes にする必要があります

于 2012-11-01T18:33:44.247 に答える