在Cassandra中存储值列表

时间:2012-03-26 14:53:53

标签: cassandra

版本相关

这个问题的一些答案涉及旧版Cassandra。这类问题的正确答案取决于您使用的Cassandra版本。


我有一个个人资料列系列,希望在每个个人资料中存储一系列技能。我不确定这是如何在Cassandra中完成的。一种选择是存储序列化的Thrift或protobuf,但我不想这样做,因为我认为Cassandra不了解这些格式,因此数据存储区中的数据不会是人类可读的或者从命令行通过CQL查询。我想到的另一个解决方案是使用超级列并将技能作为具有空值的键:

skills: {
  'java': '',
  'c++': '',
  'cobol': ''
}

这是处理Cassandra列表的好方法吗?我想有一些我不知道的成语。我正在使用Astyanax客户端库,它只支持复合列而不是超级列 列,所以我在上面提出的解决方案在这种情况下看起来很尴尬。虽然我仍然在理解复合材料列时遇到一些麻烦,因为它们似乎尚未完全记录。这个解决方案是否适用于复合柱?

3 个答案:

答案 0 :(得分:4)

这个答案可以追溯到Cassandra 1.2版本发布之前,它为处理列表提供了截然不同的功能。如果您使用Cassandra 1.2 +,答案可能不合适。


我会在列键中对列表进行编码,使用具有实际列名称的复合列作为第一维,即:

row_key -> {
     [column_name; entry1] -> "",
     [column_name; entry2] -> "",
     ... 
}

然后,要读取列表,您需要从[column_name; ]到[column_name; ] - 注意空白尺寸。

关于这个的好处是它实际上很好地实现了一个集合;列表不能包含两次相同的东西。我认为这些可以在你的用例中使用。该列表也将按排序顺序维护。

答案 1 :(得分:3)

这个答案可以追溯到Cassandra 1.2版本发布之前,它为处理列表提供了截然不同的功能。如果您使用Cassandra 1.2 +,答案可能不合适。


正如邮件列表中所提到的,我的偏好对我来说非常有用,就是存储单个列“技能”,其值为序列化的JSON字符串。

真的归结为你对“技能”的使用模式。

  • 如果“技能”仅适用于每个用户的CRUD,这很好。
  • 如果您希望能够搜索具有“cobol”技能的所有用户,那么我仍然会推荐这种方法,并且还有另一个即技能:cobol有一个列UUID的值和时间戳的值或类似的东西......
  • 我确信将Pig / Hadoop集成到您的cassandra节点,您仍然可以非常愉快地查询具有x,y和z的所有用户,以生成新数据以支持其他用例。

答案 2 :(得分:3)

在旧版本的Cassandra中,您必须自己序列化列表并将其存储在列中,或者使用超级列。

Since version 1.2 of Cassandra,CQL3具有列的集合类型,因此您可以将list<text>作为模式中列的类型。例如:

 CREATE TABLE Person (
    name text,
    skills list<text>,
    PRIMARY KEY (name)
 );

如果您想自动消除重复项,可以使用set<text>