【问题标题】:Set Partition Key Column Size设置分区键列大小
【发布时间】:2023-04-09 09:16:02
【问题描述】:

我有一个近期历史表。它应该只关心插入到其分区 (user_id) 中的最后 100 个宽行。

如果您要插入 100 条之后的记录,那么我们应该期望它会覆盖最旧的数据。

我的桌子是这样的

        CREATE TABLE IF NOT EXISTS user_history (
            user_id text, 
            ts timeuuid,
            history_data text,              
            PRIMARY KEY (user_id, ts)
        )
        WITH CLUSTERING ORDER BY (ts DESC);

我很乐意让 Cassandra 为我处理这件事。也许设置一个在限制后循环的分区列大小? Cassandra 能做到吗?

您会推荐哪种方法?

我现在能想到的想法是: 1)对选择使用限制100,然后对100范围之外的记录调用删除。请注意,这似乎很乏味..

【问题讨论】:

    标签: cassandra datastax cql cqlsh


    【解决方案1】:

    没有办法卷起来。

    只是一个想法,您可以为此目的使用分桶:

        CREATE TABLE IF NOT EXISTS user_history (
            user_id text, 
            bucket int,
            ts timeuuid,
            history_data text,              
            PRIMARY KEY ((user_id, bucket), ts)
        )
        WITH CLUSTERING ORDER BY (ts DESC);
    

    这是一个反向时间序列,您可以在其中根据一些自定义存储桶 ID 进行分区。这个想法是有 N 个桶,每个桶最多有 100 个项目。

    不过,这需要一些应用程序编码:

    • 您需要跟踪最后一个桶中有多少项目
    • 当您的最后一个存储桶包含 100 个项目时,您会增加您的“当前”存储桶
    • 您需要跟踪“当前”存储桶编号
    • 当您查询时,您最多会从“当前”存储桶中获取 100 个项目,但如果您获取的项目少于 100 个,则您会从“当前-1”存储桶中获取剩余的项目。李>
    • 当您删除旧数据时,(小于当前存储桶的所有存储桶 - 2)您在分区级别删除

    【讨论】:

    • 感谢您的确认