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

根据时间范围删除Cassandra表中的记录,cassandra,cqlsh,Cassandra,Cqlsh,我有一个带有模式的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表:

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(列名称)
函数检索该WriteTime(warning:它不适用于集合列,对于UDT返回null!)。但是,由于CQL中没有嵌套查询,因此您需要编写一个程序来获取数据,按WriteTime筛选条目,并删除WriteTime早于阈值的条目。(注意
writetime
的值以微秒为单位,而不是像CQL的
timestamp
类型那样以毫秒为单位)

最简单的方法是使用,如下所示:

val timestamp=someDate.toInstant.getEpochSecond*1000L
val oldData=sc.cassandraTable(srcKeyspace,srcTable)
。选择(“prk1”、“prk2”、“reg_col”。将writeTime设置为“writeTime”)
.filter(row=>row.getLong(“writetime”)

其中:
prk1
prk2
。。。是主键的所有组件(
documentId
sequenceNo
)和
reg\u col
——表中非集合或UDT的任何“常规”列(例如,
clientId
)。重要的是,
select
deleteFromCassandra
中的主键列列表是相同的。

我同意你的方法,甚至我最初的想法也是相同的。然而,我担心的是,数据库中有大量数据(6个节点上大约6TB)。我怀疑最初获取所有记录,然后对同一记录应用筛选器来删除记录是不可行的。我希望避免(获取记录)删除数据的第一步。如果我的理解是正确的,我们将首先得到100条记录,在使用时间戳过滤后,我们标记了70条需要删除的记录,然后我们必须向DB发出70条查询以进行删除(在最坏的情况下),对吗?Spark Cassandra Connector通过将查询拆分为令牌范围来并行化查询,并处理数据。Spark应该优化数据的读取和过滤,因此它不应该读取所有数据作为一个整体&然后过滤-过滤应该与读取数据并行进行真正的优化将仅当您将时间戳作为第一个聚类列时-即使您将时间戳作为一个单独的列而不是第一个聚类列,然后它将与我描述的一样工作。谢谢你的解释。Spark API应该并行过滤记录。我们没有在项目中使用spark cassandra connector(使用准备好的语句、查询生成器),但是,请您澄清一点。使用spark API,我认为它应该在没有时间戳的情况下作为模式中的显式列工作。所以,当你说“真正的优化将是…”时,你的意思是如果我们在列中有时间戳,那么就不需要这个spark的过滤器API,可以直接用时间戳列查询,对吗?这里有几点。1) 您可以在没有Spark的情况下访问
writetime
,但如果您这样做,则需要对数据进行完整扫描,如果您以前没有这样做过,这项任务就不那么容易了-Spark会为您完成。2) 优化也与Spark无关——如果您将timestamp列作为第一个集群列,那么过滤将在Cassandra端进行,并且您不需要从Cassandra读取所有数据。