如何在列族中存储数组

时间:2012-11-10 14:23:12

标签: cassandra

我有一些彼此相关的特定数据集。我需要将它们存储在列中。

如何为商店数组或集合创建列族?谢谢!

2 个答案:

答案 0 :(得分:1)

如果您使用PlayOrm进行cassandra,您只需

 @NoSqlEmbedded
 private List<String> stuff;

它适合你。

如果您自己动手,只需将其转换为字节并存储即可。但要小心。有服务器1和服务器2读取值a,b,c和服务器1添加d和服务器2添加e的情况。如果你不做PlayOrm为你做的事情并且两个服务器都回写,你最终得到a,b,c,d或a,b,c,e。使用上面的PlayOrm,当两个服务器都回写时,你最终得到a,b,c,d,e。

如果你想和PlayOrm做同样的事情,那么将每个元素存储在它自己的列中是明智的,所以写入是独立的,不要互相吹嘘,但也许你对它好吗?

编辑:PlayOrm获取a,b,c,d的列表,并将其视为一个集合,因此每个都是唯一的。现在,假设使用PlayOrm的两台服务器进行写操作。

一台服务器写出来 stuff:a = null,stuff:b = null,stuff:c = null

第二台服务器写出来 stuff:a = null,stuff:b = null,stuff:d = null

如果您阅读上述内容,最终会得到a,b,c,d。如果您执行此操作并写入ONE列,则最后一个服务器获胜,但在此策略中,结果将合并。这称为复合列名称,我们将值存储在列名而不是值字段中。

如果您感兴趣,可以获取更多信息.....在PlayOrm中,您可以创建一个类似的实体

 @NoSqlEntity
 public class Entity {
    @NoSqlId
    private String id;
    @NoSqlEmbedded
    private List<String> stuff = new ArrayList<String>();
 }

然后你可以像这样保存它

 NoSqlEntityManager mgr = ...
 mgr.put(someEntity);
 mgr.put(otherEntity);
 mgr.flush();  //here it is all actually written together

刷新也很好,因为如果你的任何一个代码中都有异常,那么它的写入就会保护你免受nosql商店中数据损坏的影响。

因此,PlayOrm基本上会将您实体的每个实例转换为noSql存储中的一行。您可以在这里查看playorm功能列表

https://github.com/deanhiller/playorm#playorm-feature-list

基本上,它不能真正成为JPA,因为它利用了JPA没有的许多新的noSql模式。

答案 1 :(得分:1)

为什么不为每个列表元素创建一列?

例如,

array = [a,b,c,d]

col name   col value
---------------------
array:0  | a
array:1  | b
array:2  | c
array:3  | d