我使用以下代码创建了一个表格层:
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(<<<EOD
select * from layer ORDER BY layer_position DESC
EOD
);
$result = $session->execute($select);
但是这个查询不起作用。请有人帮帮我吗?
答案 0 :(得分:6)
简单地说,Cassandra只在分区键中强制执行排序顺序。
PRIMARY KEY (layer_name, layer_position)
) WITH CLUSTERING ORDER BY (layer_position DESC)
在这种情况下,layer_name
是您的分区键。如果您在WHERE子句中指定layer_name
,那么layer_name
的值的结果将按layer_position
排序。
SELECT * FROM layer WHERE layer_name = 'layer1';
您无需指定ORDER BY。所有ORDER BY在查询级别实际上都可以应用不同的排序方向(升序与降序)。
Cassandra以这种方式工作,因为它的设计目的是按照磁盘上的排序顺序读取数据。您的分区键按散列标记值排序,这就是未绑定WHERE子句的结果似乎是随机排序的原因。
修改强>
我必须使用
state_id
列获取数据,并且应该按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。”答案 1 :(得分:-1)
您无法直接在Cassandra中使用order by
。
仅当您的分区键受order by
或EQ
限制时,您才可以在群集列上应用IN
。
答案 2 :(得分:-1)
You can use order by clause in cassandra by creating materilaized view table.