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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dape,
Wenn Sie die max-Versionen 1 und haben mehr als einen Eintrag für eine Zelle, Hbase Grabsteine des älteren Zellen und bekommt und durchsucht Sie nicht sehen können, es sei denn, natürlich, Sie geben einen bestimmten timestamp-Bereich, das sich nur auf eine Zelle. Die veralteten Zellen werden nur dann gelöscht, nach einem Major_compact auf den Tisch, wenn die älteren Zellen aufhören würde aufspringen.
Immer die neuesten Zellen aus einem scan alle Sie tun müssen ist, verwenden Sie die Methode unten -
InformationsquelleAutor sulabhc
müssen Sie kopieren die Krüge, um die ganze region-Server, und Bearbeiten HBASE_CLASSPATH in hbase-env.sh auf region-Server entsprechend
können Sie angeben, timerange und MaxVersions auf Scanner, um alte Versionen, die innerhalb dieses Bereichs
InformationsquelleAutor Sola Yang
Ich denke, das ist genau das gleiche problem ich lief in hier: HBase Holen Sie zurück die alten Werte noch mit max Versionen = 1
Es stellt sich heraus, dass ein Fehler in hbase.
Siehe: https://issues.apache.org/jira/browse/HBASE-10102
InformationsquelleAutor Niels Basjes