2013-08-02 73 views
2

假设我有一个表以下组成。CQL3更改主键

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)。我找不到任何文件告诉我如何做到这一点。可能吗?

另外,我错过了“正确”的方式来解决这个问题/我误解了这个问题?

回答

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 

所以检索一定范围的天,卡桑德拉需要“跳过”为每个键。这是低效的,不受支持。你需要让他们在这个顺序:

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 

不幸的是这样做是重写所有数据的唯一途径,并且在卡桑德拉这样做的没有内置的方法。你可以编写一个脚本来完成这项工作,方法是读取一个CF中的数据,调换顺序,然后写出新的CF和开关。如果这需要现场完成,那就更困难了,但仍然有可能。