使用Cassandra和CQL3,如何在单个请求中插入整个宽行?

Les*_*ood 6 cassandra cql3 datastax-java-driver

我想在Cassandra 1.2.8中插入一行包含50,000列的单行.在插入之前,我已准备好整个行的所有数据(在内存中):

+---------+------+------+------+------+-------+
|         | 0    | 1    | 2    | ...  | 49999 |
| row_id  +------+------+------+------+-------+
|         | text | text | text | ...  | text  |
+---------+------+------+------|------+-------+
Run Code Online (Sandbox Code Playgroud)

列名是整数,允许切片进行分页.列值是该特定索引处的值.

CQL3表定义:

create table results (
    row_id text,
    index int,
    value text,
    primary key (row_id, index)
) 
with compact storage;
Run Code Online (Sandbox Code Playgroud)

由于我已经在内存中拥有row_id和所有50,000个名称/值对,我只想在单个请求/操作中向Cassandra中插入一行,以便尽可能快.

我似乎唯一能找到的是执行以下50,000次:

INSERT INTO results (row_id, index, value) values (my_row_id, ?, ?);
Run Code Online (Sandbox Code Playgroud)

第一个?是索引计数器(i),第二个?是要存储在位置的文本值i.

这需要很多时间.即使我们将上述INSERT放入批处理中,也需要花费很多时间.

我们完整地拥有了我们需要的所有数据(完整的行),我认为很容易说"这里,Cassandra,将这些数据作为一行存储在一个请求中",例如:

//EXAMPLE-BUT-INVALID CQL3 SYNTAX:
insert into results (row_id, (index,value)) values 
    ((0,text0), (1,text1), (2,text2), ..., (N,textN));
Run Code Online (Sandbox Code Playgroud)

通过当前的CQL3语法无法实现此示例,但我希望它能说明所需的效果:所有内容都将作为单个查询插入.

是否可以在CQL3和DataStax Java驱动程序中执行此操作?如果没有,我想我将被迫使用Hector或Astyanax驱动程序和Thrift batch_insert操作?

Les*_*ood 3

编辑:在我发布有关 Cassandra 1.2.9 的问题后仅 4 天,Cassandra 2.0 Final 就发布了。2.0 支持批处理准备好的语句,这应该比 C* < 2.0 所需使用的非批处理 CQL3 快得多。我们尚未对此进行测试以确定。

当这个问题于 4 天前(即 2013 年 8 月 30 日)发布时,对于低于 2.0 的 C* 版本,在 CQL3 中这是不可能的。这只能通过 Thrift 客户端实现,例如 Astyanax 的MutationBatch。

根据 Alex 的建议,我创建了CASSANDRA-5959作为功能请求,但它被标记为CASSANDRA-4693 的副本,据说它解决了 C* 2.0 的问题。

  • 谢谢莱斯。虽然我确实同意此时可以将其视为 java 驱动程序的限制,但实际上我认为这更多的是 CQL 限制。希望 Cassandra 的人会同意并添加它。 (3认同)