2012-07-12 77 views
2

我需要爲每個每晚構建存儲基準運行。爲此,我想出了以下數據模型。創建複合列cassandra

BenchmarkColumnFamily= { 

    build_1: { 
     (Run1, TPS) : 1000K 
     (Run1, Latency) : 0.5ms 
     (Run2, TPS) : 1000K 
     (Run2, Latency) : 0.5ms 
     (Run3, TPS) : 1000K 
     (Run3, Latency) : 0.5ms 
    } 

    build_2: { 
     ... 
    } 
... 

} 

要創建這樣一個模式,我想出了以下命令卡桑德拉 - CLI:

create column family BenchmarkColumnFamily with 
    comparator = 'CompositeType(UTF8Type,UTF8Type)' AND 
    key_validation_class=UTF8Type AND 
    default_validation_class=UTF8Type AND 
    column_metadata = [ 
    {column_name: TPS, validation_class: UTF8Type} 
    {column_name: Latency, validation_class: UTF8Type} 
    ]; 

請問上面的命令創建模式,我打算創造?我混淆的原因是,當我插入數據到上面的CF中使用: set BenchmarkColumnFamily['1545']['TPS']='100'; 即使比較器類型是複合的,它也會被成功插入。此外,即使以下命令也能成功執行:

set BenchmarkColumnFamily['1545']['Run1:TPS']='1000'; 

這是什麼im缺失?

回答

2

我不認爲你做錯了什麼。 CLI根據類型解析字符串的值,可能使用org.apache.cassandra.db.marshal.AbstractType<T>.fromString()。對於複合類型,它使用':'作爲字段分隔符(不是我見過的文檔,但是我嘗試使用Java代碼來說服自己)。複合材料的第一部分,並留下第二個爲空要只設置第二個,你可以使用

set BenchmarkColumnFamily['1545'][':NOT_TPS']='999'; 

從CLI,dump出來CF:

list BenchmarkColumnFamily; 

,你應該看到所有名稱(所有行),例如

RowKey: 1545 
=> (column=:NOT_TPS, value=999, timestamp=1342474086048000) 
=> (column=Run1:TPS, value=1000, timestamp=1342474066695000) 
=> (column=TPS, value=100, timestamp=1342474057824000) 

沒有辦法(通過CLI)將組合元素限制爲非空值或特定值,這是您必須在代碼中執行的操作。

此外,CF創建的column_metadata選項是不必要的,因爲您已經將默認驗證列爲UTF8Type。

2

cassandra-cli工具在處理複合材料方面非常有限。此外,Cassandra在驗證顯式的用戶提供的合成方面可能會發生一些意想不到的情況。我不知道你的情況的確切答案,但我可以告訴你,你會發現這種模型很大程度上使用CQL 3引擎更容易使用

例如,你的模型可表示爲:

CREATE TABLE BenchmarkColumnFamily (
    build text, 
    run int, 
    tps text, 
    latency text, 
    PRIMARY KEY (build, run) 
); 

INSERT INTO BenchmarkColumnFamily (build, run, tps, latency) VALUES ('1545', 1, '1000', '0.5ms'); 

有關該如何轉換爲存儲引擎層的更多信息,請參見this post

+0

我不認爲這符合OP的模式;這將創建一個複合鍵。有關詳細信息,請參閱[本文](http://www.datastax.com/dev/blog/introduction-to-composite-columns-part-1)中的註釋。 – libjack 2012-07-16 21:41:23

+0

它創建一個複合CQL密鑰,而不是複合Cassandra密鑰。在存儲層,這將創建複合列名稱,就像他擁有的一樣。真的不建議使用Cassandra-cli來處理這類事情。 (這篇文章是在cql3之前寫的,甚至是一件事。) – 2012-07-18 00:12:25

+0

好的,謝謝..將不得不探索cql3一些。無可否認,我一直在使用CLI和/或Java API進行大部分工作。 – libjack 2012-07-18 18:43:52