【问题标题】:query cassandra table with timestamp range without using allow filtering在不使用允许过滤的情况下查询具有时间戳范围的 cassandra 表
【发布时间】:2019-09-09 20:41:01
【问题描述】:

我想添加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)""")

【问题讨论】:

    标签: python cassandra


    【解决方案1】:

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

    【讨论】:

    • 如果一直在写当月的数据,那么他就会有热分区,并且可能无法水平扩展......
    • @AlexOtt 正是如此,这就是为什么他们需要选择一个适合其访问模式和业务逻辑的存储桶。
    猜你喜欢
    • 2021-09-10
    • 1970-01-01
    • 2021-06-30
    • 2014-05-07
    • 1970-01-01
    • 2018-01-15
    • 2015-06-06
    • 2020-06-09
    • 2022-08-12
    相关资源
    最近更新 更多