2012-06-21 1 views
3

나는 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

답변

2

DAPE, 사용자가 설정

을 최대 버전이 1이고 셀에 대해 둘 이상의 항목이있는 경우 Hbase은 이전 셀을 삭제 표시하고 가져오고 스캔하면 해당 셀을 볼 수 없습니다. e 셀. 삭제 된 셀은 Major_compact가 테이블에서 실행 된 후에 만 ​​삭제됩니다. 이는 오래된 셀이 팝업을 멈출 때입니다. HBase와의 모든 지역 서버로 항아리를 복사해야

Result.getColumnLatest(family, qualifier) 
+0

이 방법은 hbase 셸에서 사용할 수 없습니다. 맞습니까? – dape

2
java.io.IOException: IPC server unable to read call parameters: Error in readFields 

, 편집 HBASE_CLASSPATH -

은 항상 당신이 할 필요가 아래의 방법을 사용하는 검사의 최신 세포를 얻으려면 -env.지역 서버에서 쉬 따라

당신은 시간 범위 내에서 이전 버전을 얻을 스캐너에 timerange 및 MaxVersions를 지정할 수 있습니다

scan.setMaxVersions(Integer.MAX_VALUE); 
scan.setTimeRange(startVersion, endVersion);