基于时间范围删除cassandra表中的记录

5kgi1eie  于 2021-06-10  发布在  Cassandra
关注(0)|答案(1)|浏览(530)

我有一个带有模式的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之类的特性所使用。
既然给定的模式中没有用于插入时间戳的显式列,那么有没有一种方法可以使用隐式时间戳,或者有没有更好的方法?
插入后,记录不会有任何更新。

pnwntuvh

pnwntuvh1#

这是个有趣的问题。。。
所有不属于主键的列都有所谓的writetime,可以使用 writetime(column_name) cql的函数(警告:它不适用于集合列,对于udts返回null!)。但由于cql中没有嵌套查询,因此您需要编写一个程序来获取数据、按writetime筛选条目,并删除writetime早于阈值的条目(请注意 writetime 以微秒为单位,而不是以毫秒为单位 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"))

哪里: prk1 , prk2 , ... 是主键的所有组件( documentId 以及 sequenceNo 在你的情况下),以及 reg_col -表中不是集合或udt的任何“常规”列(例如, clientId ). 在 select 以及 deleteFromCassandra 是一样的。

相关问题