我们的问题与通常的时间序列问题略有不同,因为我们的数据中没有自然分区键。在我们的系统中,我们得到的消息不超过5k / s,所以在许多出版物(如this one)之后我们想出了一个以下的模式(它更复杂,但下面最重要):
CREATE TABLE IF NOT EXISTS test.messages (
date TEXT,
hour INT,
createdAt TIMESTAMP,
uuid UUID,
data TEXT,
PRIMARY KEY ((date, hour), createdAt, uuid)
)
我们主要想根据创建(事件)时间查询系统;其他过滤可能会在Spark等不同的引擎上完成。问题是我们可能有一个跨越例如两个月,理想情况下我们应该在查询的WHERE-IN部分中放置60多个日期和24小时,这至少可以说是麻烦的。当然,我们可以执行如下查询:
SELECT * FROM messages WHERE createdat >= '2017-03-01 00:00:00' LIMIT 10 ALLOW FILTERING;
我的理解是,虽然上述工作,它将进行全面扫描,这在较大的群集上将是昂贵的。或者我错了,C *知道,扫描哪些分区?
我正在考虑添加一个索引,但根据我的理解,这个问题很可能属于high-cardinality antipattern。
编辑:关于数据模型的问题并不多,虽然建议值得欢迎,但更多关于使用cratedat
范围进行查询或列出所有date
和{{1}的可行性的可行性在查询的WHERE-IN部分中需要的值以避免完全扫描。