2013-08-06 56 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

没关系,我已经整理过了。使用二进制比较器。谢谢你的帮助。对于尝试对非复合行键使用复合类型也有一个完全不相关的问题。 –