设置分区键列大小

时间:2016-12-28 16:59:05

标签: cassandra datastax cql cqlsh

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

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

我的桌子就像是

var array1 = ['a', 'b', 'c', 'd'];
var array2 = ['a', 'v', 'n', 'd', 'i', 'f'];

var array3 = ['1', '2', '3', '4', '5', '6'];

var result = array2.map(function(e, i) {
  return e == array1[i] ? array3[i] : e;
})

console.log(result)

我很想让Cassandra为我照顾这个。也许设置一个分区列大小,在限制后循环?卡萨桑德拉可以这样做吗?

您会推荐哪种方法?

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

1 个答案:

答案 0 :(得分:0)

没办法卷起来。

只是一个想法,你可以将bucketing用于此目的:

    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)在分区级别删除