python - 在不使用允许过滤的情况下查询具有时间戳范围的 cassandra 表
问题描述
我想添加类型的二级索引timestamp
,以便能够在没有“ALLOW FILTERING”的情况下按时间戳范围进行查询。我不能使用 timeuuid,因为时间戳与 now() 不同。我有日期时间,我应该将其转换为时间戳。
我想按时间查询,例如:
session.execute("SELECT id from my_table WHERE date>'2019-09-01' AND date<'2019-09-04'")
.
有什么建议是正确的做法吗?或者如何使用 python 中的 timuuid 输入日期时间?(将日期时间转换为 uuid 字段)
谢谢。
my_table = session.execute(""" CREATE TABLE IF NOT EXISTS my_keyspace.my_table
(id text,
date timestamp,
PRIMARY KEY (id)
)""")
session.execute("CREATE INDEX time_idx ON my_keyspace.my_table (date)""")
解决方案
每当我在 Cassandra 中看到一个表在一个几乎唯一的列(例如:)上有一个主键时,PRIMARY KEY (id)
我预见到会发生这样的问题。关于添加二级索引绝对是一种反模式,您是对的。我对这些设计的问题是“你曾经查询过id
吗?” 因为如果你不这样做,它不应该是唯一的主键。
我肯定会把你的桌子分区在别的东西上。 本质上,您想一起查询的数据,您也想一起存储。
假设对于您的用例,您实际上只关心上个月的数据。当然,这也假设单个分区上一个月的数据量不违反 Cassandra 每个分区 20 亿个单元的限制。但它会成为一个很好的例子,所以我会像这样构建你的表:
CREATE TABLE data_by_month (
id TEXT,
date TIMESTAMP,
month_bucket INT,
value1 TEXT,
value2 TEXT,
PRIMARY KEY ((month_bucket),date,id));
这是一种称为“时间分桶”的建模技术。在将每个月的所有数据存储在同一个“桶”中时,我现在可以运行如下查询:
aaron@cqlsh:stackoverflow> SELECT * from data_by_month
WHERE date>'2019-09-01' AND date<'2019-09-04' AND month_bucket=201909 ;
month_bucket | date | id | value1 | value2
--------------+---------------------------------+----+--------+--------
201909 | 2019-09-02 23:21:00.000000+0000 | 4d | 456 | abc
201909 | 2019-09-03 12:34:00.000000+0000 | 1a | 123 | abc
(2 rows)
推荐阅读
- python - R闪亮中的并行处理,调用Python脚本
- botframework - 适用于 Yammer 频道的 Azure 机器人服务
- c# - SqlLite 意外停止工作 ado.net 实体框架
- oracle-data-integrator - 本地(无代理)、独立和 java 代理在 ODI 中的意义是什么?
- swift - Monads和AOP相关?
- arrays - 在 Ajax 成功上循环遍历对象内的数组内的对象
- ios - 如何在 iOS 的 facebook accountkit UI 中更改语言
- hdfs - 在停用数据节点时重新平衡
- javascript - javascript上的超时设置功能
- java - 杰克逊:继承和必需的属性