我想在 Cassandra 1.2.8 中插入一行 50,000 列。在插入之前,我已经准备好整行的所有数据(在内存中):
+---------+------+------+------+------+-------+
| | 0 | 1 | 2 | ... | 49999 |
| row_id +------+------+------+------+-------+
| | text | text | text | ... | text |
+---------+------+------+------|------+-------+
列名是整数,允许分页切片。列值是该特定索引处的值。
CQL3 表定义:
create table results (
row_id text,
index int,
value text,
primary key (row_id, index)
)
with compact storage;
由于我已经在内存中拥有 row_id 和所有 50,000 个名称/值对,因此我只想在单个请求/操作中将单行插入 Cassandra,以便尽可能快。
我似乎唯一能找到的就是执行以下 50,000 次:
INSERT INTO results (row_id, index, value) values (my_row_id, ?, ?);
第一个?
是索引计数器 ( 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));
此示例无法通过当前的 CQL3 语法实现,但我希望它说明了预期的效果:所有内容都将作为单个查询插入。
是否可以在 CQL3 和 DataStax Java 驱动程序中执行此操作?如果不是,我想我将被迫使用 Hector 或 Astyanax 驱动程序和 Thriftbatch_insert
操作?