CQL3更改主键

时间:2013-08-02 21:54:30

标签: sorting cassandra cql3 compound-key cqlsh

假设我有一个包含以下成分的表格。

CREATE TABLE rollup (
  hashname text,
  key text,
  day timestamp,
  counter_value counter,
  PRIMARY KEY (hashname, key, day)
) WITH
...

我想运行一个看起来像

的查询
SELECT * FROM rollup WHERE hashname='some_namespaced_hash' AND day>='2013-07-15' AND day<='2013-07-25';

但是,这不起作用,因为(我认为)以下内容也与><等相关。

复合键意味着CQL现在也有理由在SELECT查询中使用ORDER BY语法,但它仍然不像您习惯的那样灵活,在SQL中进行即席查询。 ORDER BY子句只能选择一个列,该列必须是复合PRIMARY KEY中的第二列。即使对于主键中包含2个以上列组件的表

,这也适用

此处,day是主列键中的第三列。我能想到的唯一方法是将主要复合键更改为PRIMARY KEY (hashname, day, key)。我找不到任何文档告诉我如何做到这一点。有可能吗?

或者,我错过了解决这个问题的“正确”方法/我是否误解了这个问题?

1 个答案:

答案 0 :(得分:2)

你是对的,唯一的办法是切换主键的顺序。原因是,目前,您的密钥按此顺序排列:

hashname1 key1 day1: counter_value111
hashname1 key1 day2: counter_value112
hashname1 key2 day1: counter_value121
hashname1 key2 day2: counter_value122
hashname1 key3 day1: counter_value131
hashname1 key3 day2: counter_value132

因此要检索一系列日子,Cassandra需要为每个键“跳过”。这是低效的,不受支持。您需要按此顺序拥有它们:

hashname1 day1 key1: counter_value111
hashname1 day1 key2: counter_value121
hashname1 day1 key3: counter_value131
hashname1 day2 key1: counter_value112
hashname1 day2 key2: counter_value122
hashname1 day2 key3: counter_value132

不幸的是,唯一的方法是重写所有数据,并且在Cassandra中没有内置的方法。您可以编写一个脚本来执行此操作,方法是从一个CF读取数据,切换顺序,然后写出新CF和切换。如果这需要现场实现,那就更难但仍然可能。