Cassandra:只选择最新的行

时间:2016-01-02 12:06:13

标签: php cassandra cql cassandra-2.2 nosql

我使用下表:

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;

但我想要的结果只是最新的&#39;更新&#39;每个唯一的值#34; name3rd.name2nd.name1st&#34;。

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

2 个答案:

答案 0 :(得分:3)

应修改整个架构。你正在做的<a href="@Url.Action('Index', 'Home')" style="background: no-repeat url(https://wiki.mageia.org/mw-en/images/thumb/c/c8/Chromium-64px-logo.png/35px-Chromium-64px-logo.png) 0 0; display: block; width: 50px; height: 50px;"></a>,从您的应用程序角度来看显然是一个重要的问题,不应该要求SELECT:您应该对数据进行非规范化并创建一个ALLOW FILTERING和{{1}的表格是分区键。

在该非规范化结构中,registrar应该是一个分区键,用ownerid排序。然后查询将是

updated

正如您所说的那样插入行但从未更新过,在您的应用程序中,如果需要,在多个非规范化表中插入新数据应该不会很复杂。

Andy's answer 为您的表结构提供了更多详细信息和示例。

答案 1 :(得分:3)

扩展到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的分区中具有最新updated值的行。

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

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

如果您想要检索最近更新的所有数据,那么事情变得复杂。使用cassandra不容易解决这个问题,除非所有共享具有自己的一组问题的同一分区(example strategy using a 'dummy' partition key)。