Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Cassandra:仅选择最新的行_Php_Cassandra_Cql_Cassandra 2.2_Nosql - Fatal编程技术网

Php Cassandra:仅选择最新的行

Php Cassandra:仅选择最新的行,php,cassandra,cql,cassandra-2.2,nosql,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<tex

我使用下表:

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
    )
);
但我想要的结果只是每个唯一的“name3rd.name2nd.name1st”具有最新“更新”值的行


如果我在标准的SQL数据库中,我会使用嵌套的select with MAX或GROUP BY。但是,Cassandra()不支持这一点。但是我应该在CQL中做什么呢?

整个模式应该修改。您正在执行的
选择
,从应用程序的角度来看,这显然是一个重要的选择,不应该要求
允许筛选
:您应该对数据进行反规范化,并创建一个表,其中
注册器
所有者ID
是分区键

在该非规范化结构中,
updated
应该是一个分区键,按
DESC
排序。然后,查询将被删除

SELECT * FROM lp_registry.domain WHERE registrar='XXX' AND ownerid='YYY' LIMIT 10;
正如您所说的,行是插入的,但从不更新,在应用程序中,在多个非规范化表中插入新数据(如有必要)并不复杂

提供了表结构的更多细节和示例。

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

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);
创建不存在的表lp_registry.domain(
所有者文本,
命名第一个文本,
名称第二个文本,
名称第三个文本,
登记员文本,
注册时间戳,
到期时间戳,
更新的时间戳,
技术清单,
技术版本列表,
ssl布尔值,
主键((注册者,所有者ID),已更新,名称1,名称2,名称3)
)使用聚类顺序(更新的描述);
当选择数据时,它将返回分区中包含您正在查询的注册器和所有者ID的最新更新值的行

这个查询的速度会非常快,因为您的数据将由注册者、所有者id和行按降序排列在磁盘上

这是cassandra的一个关键概念,因为您的数据是根据您的查询方式组织的。您在查询中失去了灵活性,但您可以放心地看到,您将获得优异的性能,因为您正在按组织方式检索数据。这就是为什么基于查询对数据进行非规范化是至关重要的


如果您想要检索所有数据中最新更新的数据,事情就会变得复杂。这个问题不容易用cassandra解决,除非所有东西都共享同一个分区,该分区有自己的问题集()。

非常感谢您的回复和建议。对不起,我的问题,但我看不到的诀窍,让我只为唯一的域名最新的行。该示例将为给定的注册者和所有者选择10个最近更新的域。但是我怎样才能实现他们的独特性呢?@Michal我不确定我是否理解你的问题/评论,但今天晚些时候我会尝试更新我的答案。谢谢你,Andy。因此,在cassandra中不可能执行类似的操作?如果不将所有内容放在同一个分区中,可能就不可能。或者,您可以使用类似SparkSQL的东西和spark 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 ((registrar, ownerid), updated, name1st, name2nd, name3rd)
) WITH CLUSTERING ORDER BY (updated desc);