조회 함수
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 |