2013-08-06 55 views
0

我將照片存儲在列表cql3列中。我可以從cql3輕鬆查詢列表,但我也需要了解Cassandra存儲模型如何處理列表以便能夠使用JMX bulkLoad服務將我的數據存入Cassandra。如果我插入一些測試數據像這樣的列表:Cassandra列名列名

insert into dat.lgr (id, photos) values (0, [0xaa, 0xbb]); 

產生的數據,當與CLI查詢看起來是這樣的:

=> (column=photos:2fce75c0fe9811e2ab248b7126053a99, value=aa, timestamp=1375794036508000) 
=> (column=photos:2fce75c1fe9811e2ab248b7126053a99, value=bb, timestamp=1375794036508000) 

所以它看起來像Cassandra是實際存儲爲列列表中的每個元素由複合列名稱標識,包括集合名稱和未知的十六進制數字。該數字可能是一個64位散列,或兩個32位散列附加在一起。但是什麼是散列?我查看了源代碼,但沒有發現任何東西。任何幫助讚賞。

回答

2

我建議列表項的列名是UUID。至少這兩個值代表有效日期「週二,2013年8月6日下午1點○○分36秒格林尼治標準時間」(嘗試「」 2fce75c0-fe98-11e2-ab24-8b7126053a99" 在http://www.famkruithof.net/uuid/uuidgen爲例)。

這很容易驗證 - 只是截斷表,並重復相同的聲明。如果我的猜測是正確的,你會得到完全不同的列名稱爲相同的數據

+0

是的,他們是時間UUID的,謝謝。 ://github.com/apache/cassandra/blob/cassandra-1.2/src/java/org/apache/cassandra/cql3/Lists.java,所以我有一些體面的工作。但是,由於比較我的cf只是UTF8,當我嘗試添加比較UTF8的列時,我從AbstractSSTableSimpleWriter中得到錯誤:TimeUUID。任何想法? –

+0

@axle_h我想說只有一個二進制比較器才能工作。順便說一句,這個問題可能是你感興趣的:http://stackoverflow.com/questions/18071334/selecting-index-from-cassandra-list-collection。基本上,如果您使用列表,您將無法從中只選擇一個項目。我認爲,最好使用一些明確的照片ID作爲主鍵的一部分(它可能仍然是TimeUUID)。它將允許按其ID來選擇,更新或刪除任何項目。 – Wildfire

+0

沒關係,我已經整理過了。使用二進制比較器。謝謝你的幫助。對於嘗試對非複合行鍵使用複合類型也有一個完全不相關的問題。 –