1

すべてのキーが次の構造ID、DATE、OTHER_DETAILSを持つhbaseテーブルがあります。例:

10,2012-05-01,"some details"
10,2012-05-02,"some details"
10,2012-05-03,"some details"
10,2012-05-04,"some details"

...

ある日付より古いすべての行を取得するスキャンを作成するにはどうすればよいですか? たとえば、2012-05-01 と 2012-05-02 は 2012-05-03 より古いです。

 Scan scan = new Scan();
 Filter f = ???   
 scan.setFilter(f);
 scan.setCaching(1000);
 ResultScanner rs = table.getScanner(scan);
4

2 に答える 2

2

独自のFilterを作成し、メソッドfilterRowKeyを実装できます。スキャンを高速化するためにgetNextKeyHintメソッドを実装することもできますが、これは少し複雑です。このアプローチの欠点は、フィルターを含む jar ファイルを HBase クラスパスに配置し、クラスターを再起動する必要があることです。

これは、このフィルターの近似実装です。

@Override
public void reset() {
    this.filterOutRow = false;
}

@Override
public Filter.ReturnCode filterKeyValue(KeyValue v) {
    if(this.filterOutRow) {
        return ReturnCode.SEEK_NEXT_USING_HINT;
    }
    return Filter.ReturnCode.INCLUDE;
}

@Override
public boolean filterRowKey(byte[] data, int offset, int length) {
    if(startDate < getDate(data) && endDate > getDate(data)) {
        this.filterOutRow = true;
    }
    return this.filterOutRow;
}

@Override
public KeyValue getNextKeyHint(KeyValue currentKV) {
    if(getDate(currentKV) < startDate){   
         String nextKey = getId(currentKV)+","+startDate.getTime();
         return KeyValue.createFirstOnRow(Bytes.toBytes(nextKey));
    }
    if(getDate(currentKV) > endDate){   
         String nextKey = (getId(currentKV)+1)+","+startDate.getTime();
         return KeyValue.createFirstOnRow(Bytes.toBytes(nextKey));
    }
    return null;  
}

@Override
public boolean filterRow() {
    return this.filterOutRow;
}
于 2012-12-25T07:35:42.313 に答える
0

最初の行のキーをどこかに保存します。それは常に最終的な結果セットにあり、「最初の」行であるため、他のすべての行よりも古くなります(正しいですか??)

結果を除外するために使用する日付を取得し、この日付を使用して RegexStringComparator で RowFilter を作成します。これにより、指定された基準に一致する行が得られます。ここで、この行と、以前に保存した最初の行を使用して、範囲クエリを実行します。

同じ日付の行が複数ある場合は、次のように言います。

10,2012-05-04,"some details"
10,2012-05-04,"some new details"

RowFilter の後に取得する最後の行を取得し、同じ手法を使用します。

HTH

これを達成するために範囲クエリを使用できると言おうとしていました。「startrowkey」はテーブルの最初の行になります。最初の行であるため、常に最も古い行になります。つまり、結果には常にこの行が含まれます。範囲クエリの「stoprowkey」は、指定された日付を含む行になります。stoprowkey を見つけるには、「RegexStringComparator」で「RowFilter」を設定できます。

byte[] startRowKey = FIRST_ROW_OF_THE_TABLE;
Scan scan = new Scan();
Filter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL,new RegexStringComparator("YOUR_REGEX"));
scan.setFilter(filter);
ResultScanner scanner1 = table.getScanner(scan);
for (Result res : scanner1) {
    byte[] stopRowKey = res.getRow();
}
scanner1.close();

scan.setStartRow(startRowKey);
scan.setStopRow(stopRowKey);
ResultScanner scanner2 = table.getScanner(scan);
for (Result res : scanner2) {
    //you final result
}
于 2012-12-24T20:54:28.343 に答える