Filter hbase扫描时间范围返回旧版本
我有一个关于使用时间范围进行hbase扫描的问题。 我创建了一个“test”表,它有一个系列“cf”和一个版本,在我将4行数据放入该表后,使用timerange扫描该表,但是,我得到了timerange中的一个旧版本行 例如:Filter hbase扫描时间范围返回旧版本,filter,hbase,version,database-scan,Filter,Hbase,Version,Database Scan,我有一个关于使用时间范围进行hbase扫描的问题。 我创建了一个“test”表,它有一个系列“cf”和一个版本,在我将4行数据放入该表后,使用timerange扫描该表,但是,我得到了timerange中的一个旧版本行 例如: create 'test',{NAME=>'cf',VERSIONS=>1} put 'test','row1','cf:u','value1' put 'test','row2','cf:u','value2' put 'test','row3',
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'
然后我扫描这个表,下面是输出:
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
没错,第3行有最新版本
但是,如果使用时间范围扫描,我会得到以下结果:
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
它返回第3行旧版本,但此表我设置的版本等于1
如果我增加maxtimestamp,我会得到:
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
0.0330秒内3行
是的,我能理解
我想要的是扫描一个时间范围内的表,它只返回最新版本,我知道有一个TimestampsFilter,但是该筛选器只支持特定的时间戳,而不支持时间范围
有没有办法扫描一个时间范围内的表,只返回最新的verion
我尝试编写自己的timerangefilter,下面是我的代码
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();
}
导入java.io.DataInput;
导入java.io.DataOutput;
导入java.io.IOException;
导入java.util.ArrayList;
导入org.apache.hadoop.hbase.KeyValue;
导入org.apache.hadoop.hbase.filter.filter;
导入org.apache.hadoop.hbase.filter.FilterBase;
导入org.apache.hadoop.hbase.filter.ParseFilter;
导入com.google.common.base.premissions;
公共类TimeRangeFilter扩展了FilterBase{
私有long minTimeStamp=long.MIN_值;
私有long maxTimeStamp=long.MAX_值;
公共时间范围筛选器(长minTimeStamp、长maxTimeStamp){
前提条件.checkArgument(maxTimeStamp>=minTimeStamp,“最大时间戳%s必须大于最小时间戳%s”,maxTimeStamp,minTimeStamp);
this.maxTimeStamp=maxTimeStamp;
this.minTimeStamp=minTimeStamp;
}
@凌驾
public ReturnCode filterKeyValue(KeyValue v){
如果(v.getTimestamp()>=minTimeStamp&&v.getTimestamp()Dape
当您将max versions设置为1并且一个单元格有多个条目时,Hbase会删除旧单元格,并且GET和scans无法看到它们,当然,除非您指定仅限定一个单元格的特定时间戳范围。只有在表上运行主\u压缩后,才会删除删除删除删除的单元格,此时旧单元格将被删除别再出现了
要始终从扫描中获取最新的单元格,您只需使用以下方法-
Result.getColumnLatest(family, qualifier)
您需要将JAR复制到所有区域服务器,并相应地在区域服务器上的HBASE-env.sh中编辑HBASE_类路径
您可以在扫描仪上指定时间范围和最大版本,以获取时间范围内的旧版本
scan.setMaxVersions(Integer.MAX_VALUE);
scan.setTimeRange(startVersion, endVersion);
我认为这与我在这里遇到的问题完全相同:
这原来是hbase中的一个bug。
见:
scan.setMaxVersions(Integer.MAX_VALUE);
scan.setTimeRange(startVersion, endVersion);