用TTL将数据从一个Cassandra表复制到另一个表。

问题描述 投票:0回答:1

我们正在改变一个表的分区键,从分区键中删除一列。这个表中的每条记录也都有TTL。现在我们想用TTL来保存该表中的数据。我们该如何做呢?

我们可以用所需的模式创建新表,然后将数据从旧表复制到新表。但是,在这个过程中,我们会失去TTL。

更多信息 - 这个Cassandra表是由Apache Storm应用程序填充的,它从Kafka读取事件。我们可以对Kafka消息进行再水化,但Kafka有一些不需要的消息,我们不想处理。

注意--TTL是基于日期列的值决定的,而日期列的值永远不会改变。正因为如此,TTL在所有的列上总是相同的。

apache-kafka cassandra apache-storm cassandra-3.0
1个回答
2
投票

在进行具体的实现之前,先要明白TTL可能存在于单个单元格上,也可能存在于行中的所有单元格上。 而当你在执行INSERT或UPDATE操作时,你只能对查询中指定的所有列应用一个TTL值,所以如果你有2个不同TTL的列,那么你需要执行2个查询--对每个列,用不同的TTL。

关于工具--这里有2种或多或少的现成选项。

  • 使用 DSBulk. 这种方法在《中国社会科学》的例子30.1中有详细描述。本博文. 基本上,你需要使用将提取列值&TTLs的查询将数据卸载到磁盘上,然后通过为每个具有单独TTL的列生成批次来加载数据。 从例子中。
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
  • 使用 Spark Cassandra连接器 - 它支持读取&用TTL&WriteTime来写数据。 但你需要开发正在做的代码,并正确处理诸如集合、静态列等事情(或者等待 SPARKC-596 落实)
© www.soinside.com 2019 - 2024. All rights reserved.