2

假设我有一张如下组成的表格。

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

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

4

1 回答 1

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 并切换。如果这需要现场完成,那就更难了,但仍然有可能。

于 2013-08-04T10:32:38.570 回答