如何使用Cassandra版本化数据?

时间:2019-01-14 21:30:26

标签: database cassandra bigdata database-versioning

我想使用Cassandra的键值对功能。到目前为止,我一直在使用Kyotocabinet,但它不支持多次写入,因此,我想使用Cassandra对表格数据进行版本控制。

Roll No, Name, Age, Sex
14BCE1008, Aviral, 22, Male
14BCE1007, Shantanu, 22, Male

以上数据为表格格式(csv)。版本1。 接下来是版本2:

Roll No, Name, Age, Sex
14BCE1008, Aviral, 22, Male
14BCE1007, Shantanu, 22, Male
14BCE1209, Piyush, 22, Male

因此,我将上述版本称为具有以下差异的版本2: insert_patch14BCE1209作为键(PK),14BCE1209, Piyush, 22, Male作为值。 我对表的创建很熟悉,但是无法弄清楚版本控制部分。

1 个答案:

答案 0 :(得分:2)

如果使用复合主键而不是由一个字段组成的主键,则表中将具有多个版本的数据。

因此表定义可能如下所示(如果您在插入数据之前“知道”版本号):

create table test( 
  id text,
  version int,
  payload text,
  primary key (id, version)
) with clustering order by (version desc);

,并以以下方式插入数据:

insert into test (id, version, payload) values ('14BCE1209', 1, '....');
insert into test (id, version, payload) values ('14BCE1209', 2, '....');

要选择给定密钥的最新值,可以使用LIMIT 1

SELECT * from test where id = '14BCE1209' LIMIT 1;

,并为所有分区选择最新版本(不建议使用,例如,需要一种特殊的方法来进行有效处理):

SELECT * from test PER PARTITION LIMIT 1;

但这仅在您事先知道版本的情况下才有效。如果您不知道,则可以使用timeuuid类型代替int

create table test( 
  id text,
  version timeuuid,
  payload text,
  primary key (id, version)
) with clustering order by (version desc);

并以以下方式插入数据(您可以使用从代码生成的当前时间戳代替now()):

insert into test (id, version, payload) values ('14BCE1209', now(), '....');
insert into test (id, version, payload) values ('14BCE1209', now(), '....');

并选择将与上述操作相同...