加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 00:59:04 所属栏目:Java 来源:网络整理
导读:我想在Cassandra 1.2.8中插入一行包含50,000列的单行.在插入之前,我已准备好整个行的所有数据(在内存中): +---------+------+------+------+------+-------+| | 0 | 1 | 2 | ... | 49999 || row_id +------+------+------+------+-------+| | text | text |
我想在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驱动程序和Thrift batch_insert操作?

解决方法

通过使用突变多图,可以在Thrift API中使用batch_mutate方法完成多个INSERT / UPDATE.
Map<byte[],Map<String,List<Mutation>>> mutationMap = new HashMap<byte[],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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读