【问题标题】:Copying data from one Cassandra table to another with TTL使用 TTL 将数据从一个 Cassandra 表复制到另一个表
【发布时间】:2020-09-29 05:51:22
【问题描述】:

我们正在通过从分区键中删除一列来更改其中一张表的分区键。此表中的每条记录也有 TTL。现在我们要使用 TTL 保留该表中的数据。 我们该怎么做?

我们可以创建具有所需架构的新表,然后将数据从旧表复制到新表。然而,我们在这个过程中失去了 TTL。

更多信息 - 这个 Cassandra 表由一个 Apache Storm 应用程序填充,该应用程序从 Kafka 读取事件。我们可以重新处理 Kafka 消息,但 Kafka 有一些我们不想处理的不需要的消息。

注意 - TTL 是根据日期列值决定的,它永远不会改变。因为这个 TTL 在所有列上总是相同的。

【问题讨论】:

    标签: apache-kafka cassandra apache-storm cassandra-3.0


    【解决方案1】:

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

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

    • 使用DSBulk。这个方法在this blog post的例子30.1中有详细描述。基本上,您需要使用将为它们提取列值和 TTL 的查询将数据卸载到磁盘,然后通过为每个具有单独 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 Connector - 它支持使用TTL和WriteTime读写数据。但是您需要开发执行此操作的代码,并正确处理集合、静态列等内容(或等待SPARKC-596 实施)

    【讨论】:

    • TTL 是根据日期列值决定的,它永远不会改变。因为这个 TTL 在所有列上总是相同的。
    • 然后使用 DSBulk,您可以仅卸载一列的 TTL,然后用一个值将其加载回来,而无需构造批处理 - 只需执行 INSERT
    猜你喜欢
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 2012-11-24
    • 2011-05-16
    • 2012-06-20
    • 1970-01-01
    相关资源
    最近更新 更多