根据时间范围删除 Cassandra table 中的记录
Delete records in Cassandra table based on time range
我有一个 Cassandra table 架构:
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)
函数检索(警告:它不' 使用集合列,return UDT 为 null!)。但是因为我们在 CQL 中没有嵌套查询,所以您需要编写一个程序来获取数据,根据 WriteTime 过滤条目,并删除 WriteTime 早于您的阈值的条目。 (注意 writetime
的值以微秒为单位,而不是 CQL 的 timestamp
类型中的毫秒)。
最简单的方法是使用 Spark Cassandra Connector's 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
- table 的任何 "regular" 列不是集合或 UDT(例如,clientId
)。 select
和 deleteFromCassandra
中的主键列列表相同很重要。
我有一个 Cassandra table 架构:
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)
函数检索(警告:它不' 使用集合列,return UDT 为 null!)。但是因为我们在 CQL 中没有嵌套查询,所以您需要编写一个程序来获取数据,根据 WriteTime 过滤条目,并删除 WriteTime 早于您的阈值的条目。 (注意 writetime
的值以微秒为单位,而不是 CQL 的 timestamp
类型中的毫秒)。
最简单的方法是使用 Spark Cassandra Connector's 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
- table 的任何 "regular" 列不是集合或 UDT(例如,clientId
)。 select
和 deleteFromCassandra
中的主键列列表相同很重要。