본문 바로가기

IT for developer/Hadoop+Nosql

HBase - GET


HBase: The Definitive Guide 일부 발변역~ 

GET 메소드 (필터에 대해서는 다른 챕터에 나와있는듯 )
 
HTable은 저장된 것을 가져오기 위한 API로 GET 과 매칭 클래스들을 제공하고있다.

단일 row를 가져오기 위한 함수

Result get(Get get) throws IOException



Get (byte[] row)
Get (byte[] row, RowLock rowLock) 


예)
byte[] row1 = Bytes.toBytes("row1"); //'row1'은 해당 row의 키
Get get1 = new Get(row1);
Result[] results = table.get(get1);


get 오퍼레이션은 특정 row 하나만을 가져오지만 거기에 포함되어 있는 수많은 컬럼과 셸들을 가져올 수 있다.

row key - column family - column - time stamp 의 조합이 결국 하나의 좌표를 나타낸다고 볼 수 있다.

정확하게 특정 쉘들의 좌표를 지정하기 위해서는 다음과 같은 함수들을 사용한다.

Get addFamily(byte[] family)

Get addColumn(byte[] family, byte[] qualifier)

Get setTimeRange(long minStamp, long maxStamp) throws IOException

Get setTimeStamp(long timestamp)

Get setMaxVersions()

Get setMaxVersions(int maxVersions) throws IOException


addFamily 함수는 주어진 컬럼 패밀리를 국한 시켜서 데이터를 가져오도록 한다.
addColum함수는 컬럼에 국한~  컬럼패밀리는 테이블 생성시 미리 정의되어 있어야한다. 그렇지 않은 컬럼 패밀리를 사용한 경우 Exception 이 발생한다. NoSuchColumnFamilyException
setTimeStamp는 정확히 타임스탬프가 일치하는 대상으로 국한시킨다.
setTimeRange 함수는 타임스탬프의 시작과 끝으로 국한시키고 (시작은 포함되며 끝은 포함되지 않는 범위의 대상)
setMaxVersions(int maxVersions) 얼마나 많은 버전을 대상으로 조회할 지를 결정하는 것으로써, 디폴트는 1이다. 즉 가장 최근 버전으로 조회한다. 
setMaxVersions() 이는 integer.MAX_VALUE값으로 버전의 수를 지정함으로써 모든 조회가능한 버전을 대상으로 한다.

HBase는 데이터를 바이트로 읽고 쓰기 때문에 기본적으로 바이트로 변환하거나 다루기위한 클래스를 제공한다

Bytes 클래스

static String toString(byte[] b)

static boolean toBoolean(byte[] b)

static long toLong(byte[] bytes)

static float toFloat(byte[] bytes)

static int toInt(byte[] bytes)



Get 예제

 

Configuration conf = HBaseConfiguration.create();  1)


HTable table = new HTable(conf, "testtable");  2)


Get get = new Get(Bytes.toBytes("row1"));  3)


get.addColumn(Bytes.toBytes("colfam1"), Bytes.toBytes("qual1")) 4); 


 Result result = table.get(get);  5)


 byte[] val = result.getValue(Bytes.toBytes("colfam1"),

      Bytes.toBytes("qual1"));     6)      


System.out.println("Value: " + Bytes.toString(val)); 7) 



1) Configuration 생성
2) 새로운 테이블 레퍼런스 초기화
3) 특정 row를 가진 Get 생성
4) Get에 컬럼 추가
5) HBase로 부터 선택된 컬럼들을 가지고 row를 가져온다.
6) 주어진 컬럼에 대해 특정 값을 Get
7) 출력


byte[] getRow  - row key를 리턴한다.
int size() - KeyValue - 인스턴스의 수를 리턴한다.

KeyValue 형태로 가져오는 함수들도 제공한다. KeyValue는 로우레벨 데이터가 표현되어진다. 

KeyValue[] raw()
List<KeyValue> list()
List<KeyValue> getColumn(byte[] family, byte[] qualifier)
KeyValue getColumnLatest(byte[] family, byte[] qualifier)
boolean containsColumn(byte[] family, byte[] qualifier)

getColumn 최대 버전수에 따라 그 수가 결정됨
getColumnLastest 가장 최근에 저장된 셀을 리턴한다 getValue()와의 차이는 rawbyte를 리턴하지 않고 KeyValue를 리턴한다.
containsColumn  해당 컬럼이 있는지 확인한다.

여러개를 한꺼번에 조회하고자 할때

Result[] get(List<Get> gets) throws IOException



해당 row가 존재하는지 확인하고자 할때 다음과 같은 함수를 사용하자. 리턴값이 boolean 이기 때문에 그냥 조회해서 null체크하는 것보다 속다가 빠름 (리모트 서버에서 가져올수도 있으므로)

boolean exists(Get get) throws IOException



속도를 위해 아래 함수도 고려할 수 있다.

Result getRowOrBefore(byte[] row, byte[] family) throws IOException


컬럼 패밀리가 존재하는지 확인하고 없다면 null을 바로 리턴한다. 컬럼 기반 데이터 베이스이기 때문에 컬럼 존재 유무를 가지고 먼저 찾는것이 더 빠르다. 

만약에 컬럼 패밀리의 이름은 알고 있지만 컬럼명이 정확치 않거나 해당 컬럼 패밀리의 모든 컬럼에 대해 무엇인가 처리하고자 할 때 다음 함수를 이용하자.

NavigableMap<byte[], NavigableMap<byte[],   NavigableMap<Long, byte[]>>> getMap() 

NavigableMap<byte[],   NavigableMap<byte[], byte[]>> getNoVersionMap()

NavigableMap<byte[], byte[]> getFamilyMap(byte[] family)


예)
Get get = new Get(rowId);
Result result = hTable.get(get);
NavigableMap<byte[], byte[]> navigablemap = result.getFamilyMap(fileFamily);

for (byte[] value : navigablemap.values()) {
byte[] offsetCol = value;
long offset = Bytes.toLong(result.getValue(offsetFamily,
offsetCol));
}