php – Cassandra:只选择最新的行

我使用下表:

CREATE TABLE IF NOT EXISTS lp_registry.domain (
    ownerid text,
    name1st text,
    name2nd text,
    name3rd text,
    registrar text,
    registered timestamp,
    expiration timestamp,
    updated timestamp,
    technologies list<text>,
    techversions list<text>,
    ssl boolean,
    PRIMARY KEY (
        (name1st, name2nd, name3rd), 
        registrar, ownerid, registered, expiration, updated
    )
);

表不会更新,只会添加新行.每次爬虫检查域时,都会添加新行.

我正在执行此选择:

SELECT * FROM lp_registry.domain WHERE 
    registrar = 'REG-WEDOS' AND 
    ownerid = 'FORPSI-JAF-S497436' 
ALLOW FILTERING;

但是我在结果中想要的只是每个唯一“name3rd.name2nd.name1st”具有最新“更新”值的行.

如果我在标准SQL数据库中,我将使用嵌套选择MAX或GROUP BY.但是,Cassandra(MAX(), DISTINCT and group by in Cassandra)不支持此功能.但是我应该在CQL中做些什么呢?

解决方法:

扩展到Cedric’s answer(这是一个很好的建议并将其视为接受的答案),你会得到一个大致类似的表结构:

CREATE TABLE IF NOT EXISTS lp_registry.domain (
    ownerid text,
    name1st text,
    name2nd text,
    name3rd text,
    registrar text,
    registered timestamp,
    expiration timestamp,
    updated timestamp,
    technologies list<text>,
    techversions list<text>,
    ssl boolean,
    PRIMARY KEY ((registrar, ownerid), updated, name1st, name2nd, name3rd)
) WITH CLUSTERING ORDER BY (updated desc);

选择数据时,它将返回您正在查询的注册商和所有者ID的分区中具有最新更新值的行.

此查询将非常快,因为您的数据将由注册商在磁盘上组织,所有者ID按行按顺序按更新的降序排列.

这是cassandra的一个关键概念,因为您的数据是根据您查询的方式进行组织的.您在查询中失去了灵活性,但您可以放心,因为您在组织数据时检索数据,因此您将获得出色的性能.这就是为什么根据您的查询对数据进行非规范化至关重要的原因.

如果您想要检索最近更新的所有数据,那么事情变得复杂.除非一切共享具有其自身问题的相同分区(example strategy using a ‘dummy’ partition key),否则用cassandra很难解决这个问题.

相关文章

校园网上订餐系统系统主要功能模块包括公告内容(公告栏、轮...
从今天开始,正式进入项目阶段。本次的项目是跟着黑马的瑞吉...
在可预见的将来,IT不会萎缩,只会越发展越庞大,最终会渗透...
vulntarget-b靶场最详细通关记录。
MongoDB是一个开源、高性能、支持海量数据存储的。
【NoSQL数据库技术与应用】课本代码、课后答案(持续更新)