根据时间范围删除 Cassandra 表中的记录



我有一个带有模式的Cassandra表:

CREATE TABLE IF NOT EXISTS TestTable(
documentId text,
sequenceNo bigint,
messageData blob,
clientId text
PRIMARY KEY(documentId, sequenceNo))
WITH CLUSTERING ORDER BY(sequenceNo DESC);

有没有办法删除在给定时间范围内插入的记录?我知道Cassandra内部必须使用一些时间戳来跟踪每条记录的插入时间,TTL等功能将使用时间戳。

由于给定架构中没有插入时间戳的显式列,因此有没有办法使用隐式时间戳或有更好的方法?

插入后永远不会对记录进行任何更新。

这是一个有趣的问题...

不属于主键的所有列都具有所谓的 WriteTime,可以使用 CQL 的writetime(column_name)函数进行检索(警告:它不适用于集合列,并且为 UDT 返回 null! 但是,由于我们在 CQL 中没有嵌套查询,因此您需要编写一个程序来提取数据,按 WriteTime 筛选出条目,并删除 WriteTime 早于阈值的条目。 (请注意writetime的值以微秒为单位,而不是 CQL 的timestamp类型中的毫秒(。

最简单的方法是使用Spark Cassandra Connector的RDD API,如下所示:

val timestamp = someDate.toInstant.getEpochSecond * 1000L
val oldData = sc.cassandraTable(srcKeyspace, srcTable)
.select("prk1", "prk2", "reg_col".writeTime as "writetime")
.filter(row => row.getLong("writetime") < timestamp)
oldData.deleteFromCassandra(srcKeyspace, srcTable, 
keyColumns = SomeColumns("prk1", "prk2"))

地点:prk1prk2, ...是主键的所有组成部分(在您的情况下为documentIdsequenceNo(,reg_col- 表中任何不是集合或 UDT 的"常规"列(例如,clientId(。请务必selectdeleteFromCassandra中的主键列列表相同。

相关内容

  • 没有找到相关文章

最新更新