sorting - CQL3更改主键

标签 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) 。我找不到任何文档告诉我如何执行此操作。可能吗?

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

最佳答案

你是对的,唯一的方法就是改变主键的顺序。原因是,目前您的 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/

相关文章:

Python:类型错误: 'NoneType' 对象不可下标

cassandra - 在一个盒子上使用 NoSQL

mongodb - 对于广泛的读写操作 MongoDB vs Cassandra

cassandra - 如何将 RDD 插入(不保存或更新)到 Cassandra 中?

cassandra - 条件查询在 cql 3.0.0 中不起作用

cassandra - 理解 Cassandra 背后的哲学

android - Android中的Firebase数据描述排序

对组件中的数组进行排序

c# - "The ORDER BY sort key(s) type must be order-comparable"动态数据

mapreduce - Cassandra 不等于运算符