【问题标题】:Using cassandra's ttl() in where clause在 where 子句中使用 cassandra 的 ttl()
【发布时间】:2020-10-30 23:13:21
【问题描述】:

我想问是否有可能从 cassandra 获取 ttl(生存时间)大于 0 的行。所以在下一步中,我可以用 ttl 0 更新这些行。目标基本上是改变db中每个条目的所有列的ttl为0。

我尝试过SELECT * FROM table where ttl(column1) > 0,但似乎无法在 where 子句中使用 ttl() 函数。

我还找到了一种方法,我们可以将所有行导出到 csv,删除表中的数据,然后使用新的 ttl 从 csv 再次导入它们。这行得通,但很危险,因为我们有超过一百万的生产条目,我们不知道它会如何表现。

【问题讨论】:

    标签: cassandra ttl


    【解决方案1】:

    您不能仅使用 CQL 来执行此操作 - 您需要获得某些工具的支持,例如:

    • DSBulk - 您可以将所有数据卸载到 CSV 文件中,然后使用新的 TTL 集重新加载(如果将其设置为 0,则只需重新加载数据)。这是blog post that shows how to use DSBulk with TTL。但是你不能对 TTL 有条件,这就是你需要卸载所有数据的原因
    • Spark 与 Spark Cassandra 连接器(即使在本地主模式下)。版本 2.5.0 supports TTL in the Dataframe API(早期版本仅支持 RDD API)- 对于 Spark 2.4 你 need to correctly register functions。这可以一次性完成,直接在spark-shell 中使用类似的方式(您需要调整selectfilter 语句中的列):
    import org.apache.spark.sql.cassandra._
    val data = spark.read.cassandraFormat("table", "keyspace").load
    val ttlData = data.select(ttl("col1").as("col_ttl"), $"col2", $"col3").filter($"col_ttl" > 0)
    ttlData.drop("col_ttl").write.cassandraFormat("table", "keyspace").mode("append").save
    

    【讨论】:

      猜你喜欢
      • 2018-09-19
      • 2020-08-18
      • 1970-01-01
      • 2017-01-01
      • 1970-01-01
      • 2023-03-06
      • 2016-06-12
      • 2015-01-02
      • 2013-04-23
      相关资源
      最近更新 更多