时间戳范围查询的Cassandra时间序列表设计

时间戳范围查询的Cassandra时间序列表设计,cassandra,data-modeling,cql,Cassandra,Data Modeling,Cql,我们的问题与通常的timeseries问题有点不同,因为我们的数据中没有自然的分区键。在我们的系统中,我们得到的消息不超过5k/s,因此在许多出版物(如)之后,我们得出了以下模式(更复杂,但以下最重要): 我们主要希望根据创建(事件)时间查询系统;其他过滤可能会在不同的发动机上进行,如Spark。问题是,我们可能会有一个跨越两个月的查询,因此理想情况下,我们应该在查询的WHERE-in部分放置60多个日期和24小时,至少可以说这很麻烦。当然,我们可以执行如下查询: SELECT * FROM m

我们的问题与通常的timeseries问题有点不同,因为我们的数据中没有自然的分区键。在我们的系统中,我们得到的消息不超过5k/s,因此在许多出版物(如)之后,我们得出了以下模式(更复杂,但以下最重要):

我们主要希望根据创建(事件)时间查询系统;其他过滤可能会在不同的发动机上进行,如Spark。问题是,我们可能会有一个跨越两个月的查询,因此理想情况下,我们应该在查询的WHERE-in部分放置60多个日期和24小时,至少可以说这很麻烦。当然,我们可以执行如下查询:

SELECT * FROM messages WHERE createdat >= '2017-03-01 00:00:00' LIMIT 10 ALLOW FILTERING;
我的理解是,尽管上面的方法有效,但它将进行完全扫描,在较大的集群上这将非常昂贵。还是我搞错了,C*知道要扫描哪些分区

我本想添加一个索引,但据我所知,这个问题很可能会陷入其中


编辑:问题不在于数据模型,尽管建议是受欢迎的,但更多的是关于使用
cratedat
范围进行查询的可行性,或者列出查询中WHERE in部分所需的所有
date
hour
值,以避免完全扫描。

每秒5000条消息,如果您发出一个为期2个月的请求,并且每列占用20字节(取决于“数据”),那么您将看到一个500 Gb的结果——在国际海事组织看来,这不太实际,将在许多层面上造成问题。感谢您的建议,但我们知道大小,我们无法对此做太多;最后,我们处理的数据是Spark,目前我们有这样的数量,因此,这对我们来说不是一个大问题。在完整模型中,primery键中有一个UUID组件,实际上没有丢失任何东西。我的问题更多的是关于在不进行完全扫描的情况下进行高效选择,通常,在类似数据仓库的设置中使用Cassandra。每秒5000条消息,如果您发出一个2个月的请求,并且每列占用20个字节(取决于“数据”),那么您将看到一个500 Gb的结果——在我看来,这不太实际,会在多个层面上造成问题。谢谢你的建议,但是我们知道尺寸,我们不能做太多;最后,我们处理的数据是Spark,目前我们有这样的数量,因此,这对我们来说不是一个大问题。在完整模型中,primery键中有一个UUID组件,实际上没有丢失任何东西。我的问题更多的是关于在不进行完全扫描的情况下进行高效选择,以及在类似数据仓库的设置中使用Cassandra。
SELECT * FROM messages WHERE createdat >= '2017-03-01 00:00:00' LIMIT 10 ALLOW FILTERING;