假设我有一个由以下组成的表格。
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)
。我找不到任何文档告诉我如何执行此操作。可能吗?
或者,我是否缺少解决此问题的“正确”方法/我是否误解了该问题?
最佳答案
你是对的,唯一的方法就是改变主键的顺序。原因是,目前您的 key 按以下顺序排列:
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 并切换。如果这需要实时完成,那就更难了,但仍然是可能的。
关于sorting - CQL3更改主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18026682/