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);