2012-08-06 27 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個字節)」。我怎樣才能將數據插入到我上面描述的列族中。

乾杯

+0

如何變量user_id說明和ITEM_ID申報? – 2012-08-08 14:06:00

+0

它被聲明爲UUID類型。 – ShP 2012-08-08 14:51:43

回答

7

它看起來像赫克託期待包含UUID和字符串的複合材料,發現只有一個字符串。

在編寫Hector代碼之前,必須將創建DDL轉換爲CQL使用的實際存儲模式。在這種情況下,即使您有兩個主鍵,只有第一個,user_id被用作行鍵。情況總是如此。除了第一個主鍵以外,其他任何主鍵(在這種情況下都是item_id)都用於爲每列創建組合列名稱。這意味着,當爲您的my_items列族使用Hector時,您必須編寫兩列,一列用於item_ID,另一列用於描述。

item_id值的列名稱是由主鍵值2 ... n(本例中爲item_id)和值(「item_id」)的常量字符串名稱組成的組合。

描述值的列名稱也是item_id值和值名稱(「description」)的組合。

如果您編寫了3個CQL表格行,每行都具有相同的user_id但具有不同的item_id值,那麼您最終將得到一個行列鍵爲普通user_id值的單列族行,其中有6列,item_id列和每個3個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中使用術語「合成關鍵字」並不像在RDBMS中那樣真正是複合關鍵字。順便說一句,我會檢查這個代碼,只要我開始工作,我會讓你知道結果。 ;) – ShP 2012-08-09 04:29:01

+0

術語有點混亂。 CREATE TABLE顯示兩個主鍵,但這並不意味着行鍵是一個組合對象。相反,行鍵始終只是第一個主鍵,如果指定了其他任何主鍵,它們將用於構建組合列名稱以保存DDL中指定的每個CQL列的值。 – 2012-08-09 04:44:49

+0

好的,謝謝澄清。稍後我會檢查代碼,但我想這應該起作用。謝謝。 Vladica – ShP 2012-08-09 04:52:57

相關問題