3

我知道我们可以使用类似这样的方式将单个记录插入 Cassandra(以下示例取自此处):

final String INSERT_STATEMENT = "INSERT INTO employees (empID, deptID, first_name, last_name) VALUES (?, ?, ?, ?);";

result = keyspace
    .prepareQuery(CQL3_CF)
    .withCql(INSERT_STATEMENT)
    .asPreparedStatement()
    .withIntegerValue(222)
    .withIntegerValue(333)
    .withStringValue("Eric")
    .withStringValue("Cartman")
    .execute();

是否可以使用 Astyanax 的 cql3 API(如 JDBC 的 executeBatch)进行批量插入(用于多条记录)?

注意:使用 Astyanax 的 MutationBatch(基于 Thrift,而不是 CQL)对我来说似乎不是一种选择,因为我遇到了与这个相同的问题。

4

1 回答 1

6

使用 Astyanax 实现以下目标:

使用 cqlsh:

cqlsh:TEST_KS> INSERT INTO "MESSAGE_CF" (KEY, "DELETED_RECEIVER", "DELETED_SENDER", "SENDER") 
               VALUES ('user-1241324', 'Yes', 'No', 'user@mail.com');
cqlsh:TEST_KS> SELECT * FROM "MESSAGE_CF";                                                                   
 key          | DELETED_RECEIVER | DELETED_SENDER | RECEIVER | SENDER
--------------+------------------+----------------+----------+---------------
 user-1241324 |              Yes |             No |     null | user@mail.com

使用 Astyanax:

    Keyspace keyspace = Astyanax.getKeyspaceContext();
    ColumnFamily<String, String> mail = new ColumnFamily<String, String>(
        keyspace.getKeyspaceName(), // CF Name
        StringSerializer.get(),   // Key Serializer
        StringSerializer.get());  // Column Serializer

    // You could start looping here to alter what data is being inserted  
    // or make the method take in parameters and call it multiple times.         
    String  cqlStatement = 
            "INSERT INTO MESSAGE_CF (KEY, DELETED_RECEIVER, DELETED_SENDER, SENDER) "
            + "VALUES ('user-1281324', 'Yes', 'No', 'user@mail.com');";

    // execute the insertion
    OperationResult<CqlResult<String, String>> result = 
        keyspace.prepareQuery(mail).withCql(cqlStatement).execute();

   // stop looping

注意:我无法使用准备好的语句来实现这一点,Astyanax 在他们的wiki(在准备好的 CQL 下)显示支持准备好的语句,但我使用的是 astyanax-1.56.21 并且asPreparedStatement()缺少该功能。

此外,为此,不要忘记将您的 AstyanaxContext 设置为使用 CQL3。

 new com.netflix.astyanax.impl.AstyanaxConfigurationImpl()      
     .setCqlVersion("3.0.0")) //using CQL3 

更新

查看批处理关键字。批处理加速能力的主要因素是它节省了往返行程。管理 CQL 语句将更加困难,但它确实提高了更新速度。它可以执行 CUD 操作(插入、更新和删除),但不能执行 SELECT。另外,我建议您通读CQL3 文档以了解 cql 可以做什么。

于 2013-02-25T23:58:00.303 回答