나는 timerange를 사용하여 hbase 스캔에 대해 하나의 질문이 있습니다. 필자는 'test'테이블을 만들고, 'cf'라는 하나의 버전과 하나의 버전을 가지고 있으며, 그 테이블에 4 개의 행 데이터를 넣은 다음, timerange를 사용하여 해당 테이블을 스캔합니다. 그러나 이전 버전의 행을 timerange에서 가져옵니다. 예hbase 스캔 timerange 이전 버전을 반환
: 그것은 바로 row3가 최신 버전
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
그것을 :
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'
다음 I이 테이블을 검색, 다음이 출력된다.
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 이전 버전을 반환하지만,이 표는 내가 maxtimestamp을 증가하는 경우, 내가 할 일
동일한 버전을 설정 : 나는 timerange로 스캔 사용하는 경우
그러나,이 얻을 : 0.0330 초
그것은 적합한에서
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 행은, 내가 수 understa 알았어.
내가 원하는 것은 timerange 내의 테이블을 스캔하는 것입니다. 최신 버전 만 반환합니다. TimestampsFilter가 있다는 것을 알고 있지만 필터는 시간 범위가 아닌 특정 타임 스탬프 만 지원합니다.
timerange 내의 테이블을 스캔하여 최신 버전 만 반환 할 수 있습니까?
나는 내 자신의 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();
}
}
내가 HBase와의 HBASE_CLASSPATH에이 항아리를 추가 hbase-env.sh에, 그러나, 나는 다음과 같은 오류 얻을 :
[email protected], java.io.IOException: IPC server unable to read call parameters: Error in readFields
이 방법은 hbase 셸에서 사용할 수 없습니다. 맞습니까? – dape