在where子句中使用cassandra的ttl()

acruukt9  于 2021-06-13  发布在  Cassandra
关注(0)|答案(1)|浏览(539)

我想问一下是否可能从cassandra那里得到ttl(生存时间)大于0的行。因此在下一步中,我可以用ttl0更新这些行。目标基本上是将db中每个条目的所有列的ttl更改为0。
我试过了 SELECT * FROM table where ttl(column1) > 0 ,但似乎无法在where子句中使用ttl()函数。
我还找到了一种方法,可以将所有行导出到csv,删除表中的数据,然后使用新的ttl从csv再次导入它们。这是可行的,但它是危险的,因为我们有超过百万的作品,我们不知道它会如何表现。

mwngjboj

mwngjboj1#

您不能仅使用cql来实现这一点-您需要一些工具的支持,例如:
dsbulk—您可以将所有数据卸载到csv文件中,并使用新的ttl集进行加载(如果将其设置为0,则只需加载数据即可)。下面是一篇博客文章,展示了如何将dsbulk与ttl结合使用。但你不能有条件的ttl,这就是为什么你需要卸载所有的数据
使用spark cassandra连接器(即使在本地主模式下)点火。版本2.5.0支持DataFrameAPI中的ttl(早期版本仅支持RDDAPI)-对于Spark2.4,您需要正确注册函数。这可以做一次,直接在 spark-shell 使用这样的方法(您需要在 select & filter 声明):

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

相关问题