使用时间戳的范围查询的Cassandra数据建模

时间:2017-08-08 06:51:58

标签: cassandra data-modeling cql

我需要创建一个包含4列的表:

  • 时间戳BIGINT
  • 名称VARCHAR
  • value VARCHAR
  • value2 VARCHAR

我有3个必需的查询:

SELECT *
FROM table
WHERE timestamp > xxx
AND timestamp < xxx;

SELECT *
FROM table
WHERE name = 'xxx';

SELECT *
FROM table
WHERE name = 'xxx'
AND timestamp > xxx
AND timestamp < xxx;

结果需要按时间戳排序 当我使用时:

CREATE TABLE table (
    timestamp BIGINT,
    name VARCHAR,
    value VARCHAR,
    value2 VARCHAR,
    PRIMARY KEY (timestamp)
);

结果永远不会排序 当我使用时:

CREATE TABLE table (
    timestamp BIGINT,
    name VARCHAR,
    value VARCHAR,
    value2 VARCHAR,
    PRIMARY KEY (name, timestamp)
);

结果按名称&gt;排序时间戳错了。

name | timestamp
------------------------
   a | 20170804142825729
   a | 20170804142655569
   a | 20170804142650546
   a | 20170804142645516
   a | 20170804142640515
   a | 20170804142620454
   b | 20170804143446311
   b | 20170804143431287
   b | 20170804143421277
   b | 20170804142920802
   b | 20170804142910787

如何使用Cassandra执行此操作?

1 个答案:

答案 0 :(得分:1)

Cassandra通过按键分组密钥组来订购数据

在您的情况下,第一个表只有分区键timestamp,没有群集密钥。所以数据不会被排序。

对于第二个表,分区键为name,群集键为timestamp。因此,您的数据将按timestamp分组name。意味着数据将首先按其name分组,然后每个组将按timestamp分别排序。

<强>被修改

所以你需要添加如下的分区键:

CREATE TABLE table (
    year BIGINT,
    month BIGINT,
    timestamp BIGINT,
    name VARCHAR,
    value VARCHAR,
    value2 VARCHAR,
    PRIMARY KEY ((year, month), timestamp)
);

此处(year, month)是复合分区键。您必须从时间戳中插入年份和月份。因此,您的数据将在一年内按timestamp排序