2012-08-06 3 views
3

안녕과 행 삽입 나는 복합 키와 기둥 패밀리 행의이 종류에 삽입 할 :헥터 복합 키

CREATE TABLE my_items (
user_id uuid, 
item_id uuid, 
description varchar, 
PRIMARY KEY (user_id, item_id)); 

그래서 나는 노력이 : 위의 코드를 잘못 무엇

StringSerializer stringSerializer = StringSerializer.get(); 
    UUIDSerializer uuidSerializer = UUIDSerializer.get(); 
    CompositeSerializer compositeSerializer = CompositeSerializer.get(); 

    HColumn<String, UUID> hColumnObj_userID = HFactory.createColumn("user_id", userID, stringSerializer, uuidSerializer); 
    HColumn<String, UUID> hColumnObj_itemID= HFactory.createColumn("item_id", itemID, stringSerializer, uuidSerializer); 

    Mutator<Composite> mutator = HFactory.createMutator(
      repository.getKeyspace(), 
      compositeSerializer); 
    Composite colKey = new Composite(); 
    colKey.addComponent(userID, uuidSerializer); 
    colKey.addComponent(itemID, uuidSerializer); 

    mutator.addInsertion(colKey, 
      "my_items", hColumnObj_userID); 
    mutator.addInsertion(colKey, 
      "my_items", hColumnObj_itemID); 

    mutator.execute(); 

? 계속이 오류가 발생합니다 : "InvalidRequestException (이유 : UUID는 정확히 16 바이트 여야합니다)". 그리고 위에서 설명한 열 패밀리에 데이터를 삽입하는 방법은 무엇입니까?

건배

헥터는 UUID와 문자열을 포함하는 복합 기대 만 문자열을 발견 한 것 같습니다
+0

어떻게 변수는 USER_ID하고 선언 ITEM_ID? –

+0

UUID 유형으로 선언되었습니다. – ShP

답변

7

.

헥터 코드를 작성하기 전에 작성 DDL을 CQL에서 사용하는 실제 저장 패턴으로 변환해야합니다. 이 경우 두 개의 기본 키가 있더라도 첫 번째 user_id 만 행 키로 사용됩니다. 항상 그렇습니다. 다른 기본 키 (이 경우 item_id)는 첫 번째 기본 키를 제외한 모든 열에 대해 복합 열 이름을 형성하는 데 사용됩니다. 즉, my_items 열 패밀리에 Hector를 사용할 때 item_ID와 설명을 위해 두 개의 열을 써야합니다.

item_id 값의 열 이름은 기본 키 2 ... n (이 예에서는 item_id)의 값과 값 ("item_id")의 상수 문자열 이름으로 구성된 합성어입니다.

설명 값의 열 이름은 item_id 값과 값 이름 ("설명")의 합성어이기도합니다.

각 user_id는 같지만 item_id 값이 다른 3 개의 CQL 테이블 행을 작성한 경우 행 키가 일반적인 user_id 값이고 6 개의 열이있는 단일 열 패밀리 행으로 끝나야합니다. item_id 각 CQL 테이블 행에 대한 설명 열을 제공합니다.

코드는 다음과 같아야합니다

import java.util.UUID; 

import me.prettyprint.cassandra.serializers.CompositeSerializer; 
import me.prettyprint.cassandra.serializers.IntegerSerializer; 
import me.prettyprint.cassandra.serializers.StringSerializer; 
import me.prettyprint.cassandra.serializers.UUIDSerializer; 
import me.prettyprint.hector.api.Keyspace; 
import me.prettyprint.hector.api.beans.Composite; 
import me.prettyprint.hector.api.beans.HColumn; 
import me.prettyprint.hector.api.beans.AbstractComposite.ComponentEquality; 
import me.prettyprint.hector.api.factory.HFactory; 
import me.prettyprint.hector.api.mutation.Mutator; 

    // put this here to make it compile cleanly 

    Keyspace keyspace = null; 
    UUID userID = null; 
    UUID itemID = null; 
    String description = null; 

      // Row key is user_id of type UUID 

    Mutator<UUID> mutator = HFactory.createMutator(
      keyspace, 
      UUIDSerializer.get()); 

     // write column for itemID. 
     // Column name is composite of itemID value and constant "item_id" 
     // Row key is value of userID 

    Composite itemIdColumnName = new Composite(); 
    itemIdColumnName.addComponent(itemID , UUIDSerializer.get()); 
    itemIdColumnName.addComponent("item_id" , StringSerializer.get()); 
     // HFactory.createColumn takes args: column name, column value, serializer for column name, serializer for column value 
    HColumn<Composite, UUID> hColumnObj_itemID = HFactory.createColumn(itemIdColumnName, userID, new CompositeSerializer(), UUIDSerializer.get()); 
    mutator.addInsertion(userID, "my_items", hColumnObj_itemID); 

    // write column for description. 
    // Column name is composite of itemID value and constant "description" 
    // Row key is value of userID 

    Composite descriptionColumnName = new Composite(); 
    itemIdColumnName.addComponent(itemID , UUIDSerializer.get()); 
    itemIdColumnName.addComponent("description" , StringSerializer.get()); 
    HColumn<Composite, String> hColumnObj_description = HFactory.createColumn(descriptionColumnName, description , new CompositeSerializer(), StringSerializer.get()); 
    mutator.addInsertion(userID, "my_items", hColumnObj_description); 

    mutator.execute(); 
+0

흠,하지만 복합 키와 복합 열의 차이점은 무엇입니까? 복합 열을 사용하여 동일한 결과를 얻을 수 있다고 본다. 그것은 cassandra/hector에서 "composit key"라는 용어가 RDBMS에서와 같이 실제로 복합 키가 아니라는 것을 의미합니다. BTW, 내가 일하자마자이 코드를 확인하고 결과를 알려 드리겠습니다. ;) – ShP

+0

이 용어는 다소 혼란 스럽습니다. CREATE TABLE은 두 개의 기본 키를 보여 주지만 행 키가 복합 오브젝트임을 의미하지는 않습니다. 대신 행 키는 항상 첫 번째 기본 키이며 다른 기본 키가 지정되면 DDL에 명명 된 모든 CQL 열의 값을 보유하는 복합 열 이름을 작성하는 데 사용됩니다. –

+0

확인해 주셔서 감사합니다. 나중에 코드를 조금씩 점검 할 것이지만 이것이 제대로 작동 할 것입니다. 고맙습니다. 블라디 차 – ShP