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

Cassandra data modeling for range queries using timestamp

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

我有 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)
);

结果按名称 > 时间戳排序,这是错误的。

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 执行此操作?

Cassandra 按分区键聚类键组排序数据

在您的情况下,首先 table 只有分区键 timestamp,没有集群键。所以数据不会排序。

并且第二个 table 分区键是 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 排序