使用时间戳进行范围查询的 Cassandra 数据建模
Cassandra data modeling for range queries using timestamp
我需要创建一个包含 4 列的 table:
- 时间戳 BIGINT
- 名称 VARCHAR
- 值 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)
);
结果按名称 > 时间戳排序,这是错误的。
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
排序
我需要创建一个包含 4 列的 table:
- 时间戳 BIGINT
- 名称 VARCHAR
- 值 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)
);
结果按名称 > 时间戳排序,这是错误的。
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
排序