我们正在改变一个表的分区键,从分区键中删除一列。这个表中的每条记录也都有TTL。现在我们想用TTL来保存该表中的数据。我们该如何做呢?
我们可以用所需的模式创建新表,然后将数据从旧表复制到新表。但是,在这个过程中,我们会失去TTL。
更多信息 - 这个Cassandra表是由Apache Storm应用程序填充的,它从Kafka读取事件。我们可以对Kafka消息进行再水化,但Kafka有一些不需要的消息,我们不想处理。
注意--TTL是基于日期列的值决定的,而日期列的值永远不会改变。正因为如此,TTL在所有的列上总是相同的。
在进行具体的实现之前,先要明白TTL可能存在于单个单元格上,也可能存在于行中的所有单元格上。 而当你在执行INSERT或UPDATE操作时,你只能对查询中指定的所有列应用一个TTL值,所以如果你有2个不同TTL的列,那么你需要执行2个查询--对每个列,用不同的TTL。
关于工具--这里有2种或多或少的现成选项。
dsbulk unload -h localhost -query \
"SELECT id, petal_length, WRITETIME(petal_length) AS w_petal_length, TTL(petal_length) AS l_petal_length, .... FROM dsbulkblog.iris_with_id" \
-url /tmp/dsbulkblog/migrate
dsbulk load -h localhost -query \
"BEGIN BATCH INSERT INTO dsbulkblog.iris_with_id(id, petal_length) VALUES (:id, :petal_length) USING TIMESTAMP :w_petal_length AND TTL :l_petal_length; ... APPLY BATCH;" \
-url /tmp/dsbulkblog/migrate --batch.mode DISABLED