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

2024-01-09

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

+---------+------+------+------+------+-------+
|         | 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, ?, ?);

首先?is 是一个索引计数器(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操作代替?


可以使用 Thrift API 中的 batch_mutate 方法,通过使用变异多重映射来完成多个 INSERT / UPDATE。

Map<byte[], Map<String, List<Mutation>>> mutationMap = new HashMap<byte[], Map<String, List<Mutation>>>();

List<Mutation> mutationList = new ArrayList<Mutation>();

mutationList.add(mutation);
Map<String, List<Mutation>> m = new HashMap<String, List<Mutation>>();

m.put(columnFamily, mutationList);

mutationMap.put(key, m);
client.batch_mutate(mutationMap, ConsistencyLevel.ALL);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐