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操作?
编辑:在我发布有关 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 的问题。
| 归档时间: |
|
| 查看次数: |
5774 次 |
| 最近记录: |