在Cassandra中将集合作为行插入

时间:2014-03-14 08:14:25

标签: java cassandra cql

我是Cassandra的新手。我有一个场景,我将发送一组要保存的对象。例如,一个人和他的联系人。如果我必须使用像

这样的东西
public boolean addContacts(String personId, Collection<Contact> contacts){
        // My Cassandra code to save this collection as individual rows (bulk execution)
        return false;

Cassandra批处理期望一系列可以批量执行的查询。但是,为此必须循环并构建查询。那么,有没有办法避免循环收集或优化它? 我在Couch DB中遇到了与executeBulk相同的场景。

1 个答案:

答案 0 :(得分:0)

首先要确定的是架构。要创建架构,您必须分析要支持的查询。

如果您想要存储和检索每个人的联系人,可能是:

CREATE TABLE contacts (
  person_id text,
  email text,
  name text
  phone text,
  PRIMARY KEY (person_id, email)
)

(它是一个简化的架构,你应该相应地选择标识符,我只是制作一个工作样本)

通过这种方式,联系人将按person_id进行分区,并通过第二个密钥进行群集,在本例中为电子邮件。

如果您需要批量插入联系人,可以使用Datastax java driver

执行此操作

你必须像这样迭代联系人:

PreparedStatement ps = session.prepare("INSERT INTO contacts (person_id, email, name, phone) VALUES (?, ?, ?, ?)");
BatchStatement batch = new BatchStatement();
//for each contact, bind the parameters
for (Contact c : contacts) {
  batch.add(ps.bind(personId, c.email, c.name, c.phone));
}
session.execute(batch);