Cassandra 4.0.1如何按term分组获取最新timestamp对应完整行数据
问题原因
你当前查询返回错误rank的核心原因是:Cassandra 中使用聚合函数(比如max(time))时,非分组键、非聚合的列的返回值是未定义的,系统不会自动把rank字段和你计算出的max(time)所在的行做绑定,只会按存储逻辑返回分组内某一行的rank值,因此出现时间正确但关联值错误的问题。
可行解决方案
结合你现有的表结构,有两种实现方式,优先推荐第一种:
1. 直接利用聚类排序特性 + GROUP BY(无需额外建表)
你的表聚类排序规则为WITH CLUSTERING ORDER BY (term DESC, time DESC, engine DESC , url DESC),同一个domain下、同一个term对应的所有行,默认已经按time倒序排列,分组后的第一行天然就是time最大的最新行。
你不需要额外加max(time)聚合,直接执行以下查询即可得到预期结果:
SELECT time, rank, term FROM search_by_domain_termsV2 WHERE domain ='zerotoappstore.com' GROUP BY term;
这个查询在Cassandra 4.0+版本完全支持,返回的每一行就是每个term对应time最大的完整行数据,所有字段都是正确的。
2. 新增专用查询表(适合高频查询场景)
如果这个查询是业务高频使用的场景,你可以按查询驱动的建模思路,新建一张专门存储每个domain下每个term最新记录的表:
CREATE TABLE simple_search_latest ( engine text, term text, time bigint, rank bigint, url text, domain text, pagenum bigint, descr text, display_url text, title text, type text, PRIMARY KEY ((domain), term) );
每次往原表写入新数据时,同步往这张表写入同一份数据,由于主键是((domain), term),同一个domain+term的新数据会自动覆盖旧数据,你需要查询的时候直接执行:
SELECT time, rank, term FROM simple_search_latest WHERE domain ='zerotoappstore.com';
即可得到结果,查询性能比第一种方案更高,适合大数据量的高频查询场景。
内容的提问来源于stack exchange,提问作者VitalyT
相关产品推荐
相关产品推荐

