Cassandra使用可更新查询排序

时间:2014-11-12 16:24:06

标签: database-design cassandra data-modeling datastax denormalization

我有一个包含属性内容和年份的数据集。我想用属性('内容','年','频率')将它们放入CF'单词'中。 CF应支持以下操作。

  • 可以更新列的频率属性(即 - :可以运行查询,如“UPDATE words SET frequency = 2 WHERE content ='abc'AND year = 1990;),where子句应包含内容和年份
  • 应该支持选择查询,例如“从年份= 2010的单词中选择内容ORDER BY frequency DESC LIMIT 10;” (where子句只有年份),可以使用频率
  • 订购结果

使用Cassandra可以满足这种要求吗?我需要在这里使用什么CF结构和索引?我应该使用什么查询来创建CF和索引?

2 个答案:

答案 0 :(得分:2)

要使用ORDER BY,频率必须是复合PRIMARY KEY(http://www.datastax.com/documentation/cql/3.1/cql/cql_reference/select_r.html?scroll=reference_ds_d35_v2q_xj__using-compound-primary-keys-and-sorting-results)中的第二列。使用频率作为密钥禁止更新密钥的值:"通过包括组成分区密​​钥的所有列,在WHERE子句中指定要更新的行。仅支持分区键的最后一列的IN关系。 UPDATE SET操作在主键字段上无效。" (http://www.datastax.com/documentation/cql/3.1/cql/cql_reference/update_r.html

create table words (
content text,
year int,
frequency int,
PRIMARY KEY (year, frequency));

insert into words (content, year, frequency) VALUES ('lorem ipsum dolor sit amet', 2014, 10 );
insert into words (content, year, frequency) VALUES ('Sed ut perspiciatis unde', 2010, 3 );
insert into words (content, year, frequency) VALUES ('Excepteur sint occaecat', 2010, 4 );
select content, frequency from words where year = 2010 ORDER BY frequency desc limit 2;

 content                  | frequency
--------------------------+-----------
  Excepteur sint occaecat |         4
 Sed ut perspiciatis unde |         3

(2 rows)

答案 1 :(得分:0)

我使用以下表格结构作为解决方案。

create table words (
  year int,
  frequency int,
  content text,
  primary key (year, frequency, content) );

UPDATE语句不起作用,因为我们无法更改聚类列的值。但我们可以使用DELETE和INSERT代替。由于我们不知道提前的旧频率(要删除),我们需要保留另一个表映射内容,年 - >频率。