我有一个带有模式的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"))
地点:prk1
,prk2
, ...是主键的所有组成部分(在您的情况下为documentId
和sequenceNo
(,reg_col
- 表中任何不是集合或 UDT 的"常规"列(例如,clientId
(。请务必select
和deleteFromCassandra
中的主键列列表相同。