Cassandra通过cqlsh选择不同和顺序

时间:2019-02-17 15:56:15

标签: cassandra sql-order-by distinct

我是Cassandra和这个论坛的新手。我正在使用cqlsh执行Cassandra查询,但我不知道如何使用Cassandra执行类似sql select distinct a, b, c from table order by d asc之类的查询。我能怎么做?表格的结构是什么?

1 个答案:

答案 0 :(得分:0)

您的primary keypartition keysclustering columns组成。

  • DISTINCT查询只能请求分区键。
  • 集群列支持
  • ORDER BY。

假设我们有一个如下的示例表,

CREATE TABLE Sample ( 
 field1 text,
 field2 text,
 field3 text,
 field4 text,
 PRIMARY KEY ((field1, field2), field3));

DISTINCT要求所有分区键都以逗号分隔的形式传递。

因此您无法运行此查询select distinct field1 from Sample;。有效表达式为select distinct field1, field2 from Sample;

它会在内部访问群集中的所有节点以查找所有分区键,因此,如果表中有数百万个分区,那么我期望多个节点的性能都会下降。

默认情况下,field3的记录将按升序排列。下面的查询将按字段3的降序提供记录。

select * from Sample where field1 = 'a' and field2 = 'b' order by field3 desc;

如果您已经知道查询模式以及需要对数据进行排序的方式,则可以以这种方式设计表。假设您总是需要field3的降序记录,则可以通过这种方式设计表。

CREATE TABLE Sample ( 
 field1 text,
 field2 text,
 field3 text,
 field4 text,
 PRIMARY KEY ((field1, field2), field3))
WITH CLUSTERING ORDER BY (field3 DESC);

现在不按顺序查询将得到相同的结果。

您可以对多个群集列使用order by。但是您不能跳过订单。要了解下面的示例表,

CREATE TABLE Sample1 ( 
 field1 text,
 field2 text,
 field3 text,
 field4 int,
 field5 int,
 PRIMARY KEY ((field1, field2), field3, field4));

我添加了一些虚拟记录。 enter image description here

您可以按select * from Sample1 where field1 = 'a' and field2 = 'b' order by field3 desc, field4 desc;这样的多列使用订单

注意:所有字段必须为正序(field3 asc, field4 asc)或负序(field3 desc, field4 desc)。您不能(field3 asc, field4 desc)做,反之亦然。

以上查询将导致此情况。 enter image description here

通过编写,我们不能按顺序跳过顺序,我的意思是我们不能做类似select * from Sample1 where field1 = 'a' and field2 = 'b' order by field4 desc;的事情

我希望这会有所帮助!