当前位置:  开发笔记 > 编程语言 > 正文

order by子句不适用于Cassandra查询

如何解决《orderby子句不适用于Cassandra查询》经验,为你挑选了1个好方法。

我使用以下代码创建了一个表层:

CREATE TABLE layer (
    layer_name text,
    layer_position text,
    PRIMARY KEY (layer_name, layer_position)
) WITH CLUSTERING ORDER BY (layer_position DESC)

我使用以下查询以降序(层)从图层表中获取数据:

$select = new Cassandra\SimpleStatement(<<execute($select);

但是这个查询不起作用.请有人帮帮我吗?



1> Aaron..:

简而言之,Cassandra仅分区键中强制执行排序顺序。

PRIMARY KEY (layer_name, layer_position)
) WITH CLUSTERING ORDER BY (layer_position DESC)

在这种情况下,layer_name是您的分区键。如果您layer_name在WHERE子句中指定,则该值的结果layer_name将按排序layer_position

SELECT * FROM layer WHERE layer_name = 'layer1';

您无需指定ORDER BY。在查询级别上,ORDER BY真正能做的就是应用不同的排序方向(升序还是降序)。

Cassandra以这种方式工作,因为它旨在读取数据在磁盘上排序的顺序。您的分区键按哈希令牌值排序,这就是为什么未绑定WHERE子句的结果似乎是随机排序的。

编辑

我必须使用state_idcolumn 获取数据,并且应该按排序layer_position

Cassandra表针对特定查询进行了优化。虽然这导致高性能,但缺点是查询灵活性受到限制。解决此问题的方法是将您的数据复制到旨在服务该特定查询的其他表中。

CREATE TABLE layer_by_state_id (
    layer_name text,
    layer_position text,
    state_id text,
    PRIMARY KEY (state_id, layer_position, layer_name)
) WITH CLUSTERING ORDER BY (layer_position DESC, layer_name ASC);

该表将允许如下查询工作:

SELECT * FROM layer WHERE state_id='thx1138';

结果将layer_position在请求的范围内排序state_id

现在,我做出了两个假设,您将要研究:

我假设这state_id是一个很好的分区键。这意味着它具有足够高的基数,可以在群集中提供良好的分布,但是具有足够低的基数,可以返回足够的CQL行,因此值得进行排序。

我假设的组合state_id以及layer_position不是足以唯一标识每一行。因此,我通过添加layer_name作为其他聚类键来确保唯一性。您可能需要也可能不需要,但是我猜测您会。

我假设将其state_id用作分区键不会出现无限增长,从而接近Cassandra每个分区20亿个单元的限制。在这种情况下,您可能需要添加一个额外的分区“ bucket”。

推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有