hbase scan timerange alte version zurück

Ich habe eine Frage über die hbase-scan mithilfe timerange.
Ich erstelle einen 'test' - Tabelle,es hat eine Familie 'cf' und eine version , nachdem ich die 4 Zeilen von Daten in einer Tabelle, und scan-Tabelle mit timerange, allerdings bekomme ich eine alte version der Zeile in die timerange.

Beispiel:

 create 'test',{NAME=>'cf',VERSIONS=>1}
 put 'test','row1','cf:u','value1' 
 put 'test','row2','cf:u','value2'
 put 'test','row3','cf:u','value3'
 put 'test','row3','cf:u','value4'

dann scan ich diese Tabelle,die folgende ist die Ausgabe:

 hbase(main):008:0> scan 'test'
 ROW                                      COLUMN+CELL                                                                                                          
 row1                                    column=cf:u, timestamp=1340259691771, value=value1                                                                   
 row2                                    column=cf:u, timestamp=1340259696975, value=value2                                                                   
 row3                                    column=cf:u, timestamp=1340259704569, value=value4   

er es richtig,row3 die neueste version.

allerdings,Wenn ich es Scannen mit timerange ich dieses:

  hbase(main):010:0> scan 'test',{TIMERANGE=>[1340259691771,1340259704569]}
  ROW                                      COLUMN+CELL                                                                                                          
  row1                                    column=cf:u, timestamp=1340259691771, value=value1                                                                   
  row2                                    column=cf:u, timestamp=1340259696975, value=value2                                                                   
  row3                                    column=cf:u, timestamp=1340259701085, value=value3     

Rückkehr row3 alte version, aber diese Tabelle setze ich die version gleich 1

wenn ich die maxtimestamp ,bekomme ich :

  hbase(main):011:0> scan 'test',{TIMERANGE=>[1340259691771,1340259704570]}
  ROW                                      COLUMN+CELL                                                                                                          
  row1                                    column=cf:u, timestamp=1340259691771, value=value1                                                                   
  row2                                    column=cf:u, timestamp=1340259696975, value=value2                                                                   
  row3                                    column=cf:u, timestamp=1340259704569, value=value4                                                                   

3 Zeile(N) in 0.0330 Sekunden

Ist es Recht,ich kann es verstehen.

Was ich will ist, Scannen Sie eine Tabelle in eine timerange,Sie liefern nur die neueste version, ich weiß, es ist ein TimestampsFilter jedoch, dass die filter nur spezifische Unterstützung timestamp ,nicht der Zeitbereich.

Gibt es eine Möglichkeit, den scan einer Tabelle in eine timerange und nur zurück, neueste verion?

Ich versuche zu schreiben, meine eigenen timerangefilter,Folgendes ist mein code.

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.ArrayList;

import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.FilterBase;
import org.apache.hadoop.hbase.filter.ParseFilter;

import com.google.common.base.Preconditions;  

public class TimeRangeFilter extends FilterBase {

private long minTimeStamp = Long.MIN_VALUE;
private long maxTimeStamp = Long.MAX_VALUE;

public TimeRangeFilter(long minTimeStamp, long maxTimeStamp) {
    Preconditions.checkArgument(maxTimeStamp >= minTimeStamp, "max timestamp %s must be big than min timestamp %s", maxTimeStamp, minTimeStamp);
    this.maxTimeStamp = maxTimeStamp;
    this.minTimeStamp = minTimeStamp;
}

@Override
public ReturnCode filterKeyValue(KeyValue v) {
    if (v.getTimestamp() >= minTimeStamp && v.getTimestamp() <= maxTimeStamp) {
        return ReturnCode.INCLUDE;
    } else if (v.getTimestamp() < minTimeStamp) {
        //The remaining versions of this column are guaranteed
        //to be lesser than all of the other values.
        return ReturnCode.NEXT_COL;
    }
    return ReturnCode.SKIP;
}

public static Filter createFilterFromArguments(ArrayList<byte[]> filterArguments) {
    long minTime, maxTime;
    if (filterArguments.size() < 2)
        return null;
    minTime = ParseFilter.convertByteArrayToLong(filterArguments.get(0));
    maxTime = ParseFilter.convertByteArrayToLong(filterArguments.get(1));
    return new TimeRangeFilter(minTime, maxTime);
}

@Override
public void write(DataOutput out) throws IOException {
    //TODO Auto-generated method stub
    out.writeLong(minTimeStamp);
    out.writeLong(maxTimeStamp);
}

@Override
public void readFields(DataInput in) throws IOException {
    //TODO Auto-generated method stub
    this.minTimeStamp = in.readLong();
    this.maxTimeStamp = in.readLong();
}

}

Füge ich diese jar-Datei in hbase HBASE_CLASSPATH in hbase-env.sh jedoch bekomme ich die folgende Fehlermeldung:

org.apache.hadoop.hbase.client.ScannerCallable@a9255c, java.io.IOException: IPC-server nicht in der Lage zu Lesen Aufrufparameter: Fehler im readFields

InformationsquelleAutor dape | 2012-06-21

Schreibe einen Kommentar