hbase analyse timerange retour ancienne version

J'ai une question à propos de hbase scan en utilisant timerange.
J'ai créer un "test" de la table,il a une famille " cf " et une version , après j'ai mis 4 lignes de données dans cette table, et le scan de la table en utilisant timerange, cependant, je reçois une ancienne version de ligne à l'intérieur de la timerange.

par exemple:

 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'

puis-je analyser ce tableau,voici le résultat:

 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   

il le droit,row3 avoir la version la plus récente.

cependant,Si j'utilise le scanner avec timerange j'obtiens ceci:

  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     

il de retour row3 ancienne version, mais ce tableau j'ai mis la version égale à 1

si j'augmente maxtimestamp ,j'obtiens :

  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 ligne(s) dans 0.0330 secondes

C'est bon,je peux le comprendre.

Ce que je veux, c'est le scan d'un tableau à l'intérieur d'un timerange,il retourne uniquement la nouvelle version, je sais qu'il est un TimestampsFilter, cependant que le filtre seulement le support d'horodatage ,pas de plage horaire.

Est-il possible de l'analyse d'un tableau dans un timerange et ne reviennent plus récente version?

J'essaie d'écrire ma propre timerangefilter,voici mon 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();
}

}

- Je ajouter ce pot dans hbase HBASE_CLASSPATH dans hbase-env.sh cependant,j'obtiens l'erreur suivante:

org.apache.hadoop.hbase.client.ScannerCallable@a9255c, java.io.IOException: serveur IPC incapables de lire les paramètres d'appel: Erreur dans readFields

OriginalL'auteur dape | 2012-06-21