cassandra - 使用支持 order by 的集群键创建表
问题描述
我需要创建一个包含 id、创建日期、时间和其他字段的表。我需要根据最新的创建日期和时间查询一些“n”条记录。为了实现这一点,表应该如何?以 id 作为分区键,以日期和时间作为集群键的创建工作?是否可以对所有 id 进行排序,即,对分区键没有任何条件?
解决方案
使用分区键创建
id
,日期和时间作为集群键有效吗?
从技术上讲,你可以,但性能会很糟糕。无论时间戳如何,用作分区键都会将id
所有行放在不同的节点上。当您想按时间范围查询时,您还应该按时间组件存储数据。
是否可以对所有人进行排序,
ids
即对分区键没有任何条件?
不,根本不可能。Cassandra 旨在执行顺序读取。因此,Cassandra 中的结果集排序取决于已按您要检索的顺序存储的数据。
我会这样做:
CREATE TABLE events (
id UUID,
month_bucket INT,
creation TIMESTAMP,
name TEXT,
PRIMARY KEY ((month_bucket),creation,id))
WITH CLUSTERING ORDER BY (creation DESC, id ASC);
插入一些数据后,此查询有效:
aploetz@cqlsh:stackoverflow> SELECT * FROM events
WHERE month_bucket=202005
AND creation >= '2020-05-01' AND creation < '2020-05-13';
month_bucket | creation | id | name
--------------+---------------------+-------------+----------------
202005 | 2020-05-05 05:00:00 | 1d073ed5... | Cinco de Mayo
202005 | 2020-05-04 05:00:00 | 3cca75a0... | May the Fourth
202005 | 2020-05-01 05:00:00 | fd2bb58f... | May Day
(3 rows)
这利用了一种称为“bucketing”的建模技术。由于我不确定在给定时间段内可能发生的条目数量(只有你知道),我猜测并以“月”为例。基本上,你会想要选择一个时间“桶”,它是:
- 大到有用(提供查询的数据)
- 小到足以满足 Cassandra 每个分区 2GB/20 亿单元的要求。
然后,为查询提供分桶值,以及creation
.
该CLUSTERING ORDER
定义将存储的数据按creation
降序排列。 id
被添加到末尾以确保唯一性。我已经多次使用这种模式来解决日期/时间组件的范围查询模型。
推荐阅读
- python - 在python中递归地转置矩阵
- java - WebDriverException:未知错误:无法将窗口状态更改为最大化,当前状态对于 MacOSX 上的 ChromeDriver v2.43 和 Chrome 70 是正常的
- ruby-on-rails - 在 Rails5.2.1 中上传文件的最佳方式
- python - 如何使用 df.rename?
- python - 如何解析特定的句子?
- spring-boot - Spring Boot 多种输入类型的一次请求映射
- javascript - 我收到“错误:eslint 因错误而终止。[object Object] using Brackets IDE
- javascript - JavaScript - 计算两个日期之间的经过时间?
- angular - Angular 4+将字符串从一个对话框传递到另一个
- hadoop - Hive:如何在不使用科学计数法的情况下显示和存储 20 位整数?