gpt4 book ai didi

filter - hbase扫描时间范围返回旧版本

转载 作者:行者123 更新时间:2023-12-02 02:19:07 28 4
gpt4 key购买 nike

我有一个关于使用时间范围进行 hbase 扫描的问题。我创建了一个“测试”表,它有一个系列“cf”和一个版本,在我将 4 行数据放入该表中并使用时间范围扫描该表后,我在时间范围内得到了旧版本行。

例如:

 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

没错,row3已经是最新版本了。

但是,如果我使用时间范围扫描它,我会得到:

  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

它返回 row3 旧版本,但该表我将版本设置为等于 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,但是该过滤器仅支持特定时间戳,而不支持时间范围。

有没有办法扫描一个时间范围内的表并只返回最新版本?

我尝试编写自己的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();
}

}

我将此 jar 添加到 hbase-env.sh 中的 hbase HBASE_CLASSPATH 中,但是,出现以下错误:

org.apache.hadoop.hbase.client.ScannerCallable@a9255c, java.io.IOException: IPC server unable to read call parameters: Error in readFields

最佳答案

戴普,

当您将最大版本设置为 1 并且某个单元具有多个条目时,Hbase 会逻辑删除较旧的单元,并且获取和扫描无法看到它们,除非您指定仅符合一个单元的特定时间戳范围。仅当在表上运行 Major_compact 后,才会删除已删除的单元格,此时较旧的单元格将停止弹出。

要始终从扫描中获取最新的单元格,您所需要做的就是使用以下方法 -

    Result.getColumnLatest(family, qualifier)

关于filter - hbase扫描时间范围返回旧版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11133345/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com