본문 바로가기

Cassandra

Cassandra - Java를 이용하여 데이터 검색

조회 함수

Cassandra.Client 의 

어떤 칼럼 값으로 데이터를 조회하고 싶은 경우

list<KeySlice> get_indexed_slices(ColumnParent column_parent, IndexClause index_clause, SlicePredicate predicate, ConsistencyLevel consistency_level)


어떤 키의 범위로 데이터를 조회하고 싶은 경우

list<KeySlice> get_range_slices(ColumnParent column_parent, SlicePredicate predicate, KeyRange range, ConsistencyLevel consistency_level)

두 함수를 사용하면 된다.


e.g. 

city 칼럼 값이 "NY"인 row를 조회하고싶은 경우

get_indexed_slices(ColumnParent(column family), IndexClause(조회조건), SlicePredicate(어떤 칼럼들을 읽어올건지), ConsistencyLevel)


row key 값이 CAS_021 에서 NYN_042 사이의 값을 갖는 row를 조회하고싶은 경우 (또는 전체 데이터를 조회하고싶은경우)

list<KeySlice> get_range_slices(ColumnParent(column family), SlicePredicate(어떤 칼럼들을 읽어올건지), KeyRange(키 범위), ConsistencyLevel)



Cassandra에서 Slice 란?

column의 집합. 그러니까 RDB에서 말하는 row 개념이라고 생각하면 된다고 생각한다.(?)







준비물 : 이전 포스트(Cassandra - Java를 이용하여 데이터 쓰기 (column family)) 와 동일



0. 위 준비물들(라이브러리) 들의 클래스 패스를 추가한다.



1. 카산드라 서버에 접속하기

※ cassandra.yaml 파일 내부에 있는 rpc_address: localhost 를 rpc_address: 192.168.0.11 와 같이 서버 아이피로 변경해준다.

TFramedTransport tf = new TFramedTransport(new TSocket("192.168.0.11", 9160));
TProtocol proto = new TBinaryProtocol(tf);
Cassandra.Client client = new Cassandra.Client(proto);
tr.open();
		
client.set_keyspace("Hotelier" /*KeySpace*/);
서버와 연결된 Cassandra Client 가 생성된다.



2 - 1. IndexClause(조회 조건 생성)를 사용하는 경우

IndexClause indexClause = new IndexClause();
indexClause.start_key = ByteBuffer.allocate(0);
IndexExpression indexExpression = new IndexExpression();
//state column 값이 "NY"인 경우 조회
indexExpression.column_name = ByteBuffer.wrap("state".getBytes("UTF-8"));
indexExpression.value = ByteBuffer.wrap("NY".getBytes("UTF-8"));
indexExpression.op = IndexOperator.EQ;
// 조회 조건을 추가 하고 싶다면, IndexExpression 를 추가해주면 된다.
indexClause.addToExpressions(indexExpression);


2 - 2. KeyRange(키 범위 생성)를 사용하는 경우

KeyRange kRange = new KeyRange();
//전체 데이터 조회 할 경우
kRange.start_key = ByteBuffer.allocate(0);
kRange.end_key = ByteBuffer.allocate(0);
//row key의 범위를 설정할 경우
//kRange.start_key = ByteBuffer.wrap("CAS_021".getBytes("UTF-8"));
//kRange.end_key = ByteBuffer.wrap("NYN_042".getBytes("UTF-8"));



3. SlicePredicate(조회 할 칼럼들 정의)

SliceRange sliceRange = new SliceRange();
sliceRange.start = ByteBuffer.allocate(0);
sliceRange.finish = ByteBuffer.allocate(0);
//city 칼럼부터 state 칼럼까지만 조회하고 싶은 경우(column은 abc... 순)
//sliceRange.start = ByteBuffer.wrap("city".getBytes("UTF-8"));
//sliceRange.finish = ByteBuffer.wrap("state".getBytes("UTF-8"));
sliceRange.reversed = false;

SlicePredicate slicePredicate = new SlicePredicate();
slicePredicate.slice_range = sliceRange;



4 - 1. IndexClause(조회 조건 생성)를 사용하는 경우 조회

//column family 는 "Hotel"
//결과는 KeySlice 목록으로 받는다.
List<Keyslice> keys = client.get_indexed_slices(new ColumnParent("Hotel"), indexClause, slicePredicate, ConsistencyLevel.ONE);


4 - 2. KeyRange(키 범위 생성)를 사용하는 경우 조회

//column family 는 "Hotel"
//결과는 KeySlice 목록으로 받는다.
List<Keyslice> keys = client.get_range_slices(new ColumnParent("Hotel"), slicePredicate, kRange, ConsistencyLevel.ONE);



5. 조회 내용을 java 객체에 담기

for(KeySlice ks : keys){
	List<ColumnOrSupercolumn> coscs = ks.columns;
			
	Hotel hotel = new Hotel();
	String name = null;
	String value = null;
			
	for(ColumnOrSuperColumn cs : coscs){
		name = byteBufferToString(cs.column.name);
		value = byteBufferToString(cs.column.value);
				
		if(name.equals("address")) hotel.setAddress(value);
		if(name.equals("city")) hotel.setCity(value);
		if(name.equals("name")) hotel.setName(value);
		if(name.equals("phone")) hotel.setPhone(value);
		if(name.equals("state")) hotel.setState(value);
		if(name.equals("zip")) hotel.setZip(value);

//		super column family 인 경우 한단계 더 들어간다.		
//		SuperColumn sc = cs.super_column;
//		List<column> cols = sc.columns;
//		for(Column c : cols){
//			....
//		}
	}
			
	results.add(hotel);
}





반응형