조회 함수
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);
}
'Cassandra' 카테고리의 다른 글
| Cassandra - Python 2.X (pycassa)를 이용하여 데이터 조회 (0) | 2013.04.10 |
|---|---|
| Cassandra - Python 2.X (pycassa)를 이용하여 데이터 쓰기 (0) | 2013.04.10 |
| Cassandra - Java를 이용하여 데이터 쓰기 (super column family) (0) | 2013.04.05 |
| Cassandra - Java를 이용하여 데이터 쓰기 (column family) (0) | 2013.04.04 |
| Cassandra - ConsistencyLevel 정리 (0) | 2013.04.04 |