使用时间戳范围查询cassandra表,而不使用允许过滤

时间:2019-09-09 10:05:10

标签: 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? (将datetime转换为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)""")

1 个答案:

答案 0 :(得分:3)

每当我在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)