본문 바로가기

Cassandra

Cassandra - Java를 이용하여 데이터 쓰기 (super column family)

Super Column Family 란 ???

보통 Column Family는 row key를 가지고 column들을 가진다. 하지만 Super Column Family는 row key와 Super Column을 가진다.

그림으로 보면...


일반 Column Family

위와 같은 구조에 데이터는 아래와 같이 입력된다.


Super Column Family

위와 같은 구조에 아래와 같이 데이터가 입력된다.


join이 없는 대신 super column family가 있나 싶다.

어떤 경우 사용하면 유리한지 카산드라 설계 레퍼런스 자료가 있다면 보고싶다.



입력 함수

일반 Column Family에 입력할때보다 조금 복잡하다.

Cassandra.Client의 batch_mutate 함수를 사용하는데

필요한 파라미터는 아래와 같다.

batch_mutate(map<binary, map<string, list<Mutation>>> mutation_map, ConsistencyLevel consistency_level)

뭔가 복잡하다

쉽게 풀어쓰면

client.batch_mutate(map<"rowkey", map<"column famliy", vector<Mutation>>>

이런 형식이란다


Mutation 이란?

Cassandra에서 사용하는... 입력, 수정, 삭제 된 column 정보를 담은 클래스다.






준비물 : column family 에 작업 할때랑 똑같다

(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. 칼럼을 정의하고 ArrayList에 담는다.

Column descCol = createColumn("desc".getBytes("UTF-8"), "Creat viw from 102dn floor.".getBytes("UTF-8"), timestamp);
Column phoneCol = createColumn("phone".getBytes("UTF-8"), "212-777-7777.".getBytes("UTF-8"), timestamp);
List esbCols = new ArrayList();
esbCols.add(descCol);
esbCols.add(phoneCol);



3. super column을 정의하고 칼럼을 등록한다.

SuperColumn waldorfSC = new SuperColumn();
waldorfSC.name = ByteBuffer.wrap("SUPER_COL_NAME_001".getBytes("UTF-8"));
waldorfSC.columns = esbCols;



4. Mutation을 정의하고 super column을 등록한다.

ColumnOrSuperColumn descCosc = new ColumnOrSuperColumn();
descCosc.super_column = waldorfSC;
		
Mutation columns = new Mutation();
columns.setColumn_or_supercolumn(descCosc);



5. column family와 mutaion 목록으로 innerMap을 정의한다.

//innerMap 은 <String, List<Mutation>>형식 이므로 ArrayList를 만들어서 mutation을 등록해준다.
List columnsToAdd = new ArrayList();
columnsToAdd.add(columns);

//같이 입력하고 싶은 다른 자료가 있다면 또 다른 Mutation을 만들어서 같이 추가해주면 된다. 예) columsToAdd.add(colums2);
Map> innerMap = new HashMap>();
innerMap.put("PointOfInterest"/*super column family 명*/, columnsToAdd);



6. row key와 innerMap으로 outterMap을 정의한다.

Map>> outerMap = new HashMap>>();
outerMap.put(ByteBuffer.wrap("ROW_KEY001".getBytes("UTF-8")), innerMap);



7. Cassandra.Client를 이용하여 데이터를 입력한다.

client.batch_mutate(outerMap, ConsistencyLevel.ONE);





※다 작성하고 보니 꼭 super column family가 아니더라도 이런식으로 입력 처리도 가능하겠다 싶다.

그리고 mutation의 다른 속성값 deletion 을 이용해서 칼럼값을 지울 수도 있겠다 싶다. (이건 차차 테스트 해보자)




반응형