2017-04-08 18 views
2

您好我创建了一个表,用于存储这样的卡桑德拉聚类ORDER BY不能正常工作,并在正确的结果显示

CREATE TABLE keyspace.test (
name text, 
date text, 
time double, 
entry text, 
details text, 
PRIMARY KEY ((name, date), time) 
) WITH CLUSTERING ORDER BY (time DESC); 

并插入数据到table.But这样的查询提供了一个无序结果数据。

SELECT * FROM keyspace.test where device_id name ='anand' and date in ('2017-04-01','2017-04-02','2017-04-03','2017-04-05') ; 

我的桌子设计有什么问题。

+0

显示例子,而您没有得到排序结果 –

+2

不要自我宣传或任何东西,但我在2015年写了一篇关于此主题的文章,可能有所帮助:http://www.datastax。com/dev/blog/we-shall-order – Aaron

+0

@Aaron我读过你的博客。有没有其他办法可以解决我的问题? –

回答

2

我想你是误解cassandra集群的关键顺序。 Cassandra使用单个分区内的集群密钥对数据进行排序。

这是为你的情况cassandra排序数据与集群关键时间在一个单一的名称和日期。

例子:让我们插入一些数据

INSERT INTO test (name , date , time , entry) VALUES ('anand', '2017-04-01', 1, 'a'); 
INSERT INTO test (name , date , time , entry) VALUES ('anand', '2017-04-01', 2, 'b'); 
INSERT INTO test (name , date , time , entry) VALUES ('anand', '2017-04-01', 3, 'c'); 
INSERT INTO test (name , date , time , entry) VALUES ('anand', '2017-04-02', 0, 'nil'); 
INSERT INTO test (name , date , time , entry) VALUES ('anand', '2017-04-02', 4, 'd'); 

如果我们选择与您的查询数据:

SELECT * FROM test where name ='anand' and date in ('2017-04-01','2017-04-02','2017-04-03','2017-04-05') ; 

输出:

name | date  | time | details | entry 
-------+------------+------+---------+------- 
anand | 2017-04-01 | 3 | null |  c 
anand | 2017-04-01 | 2 | null |  b 
anand | 2017-04-01 | 1 | null |  a 
anand | 2017-04-02 | 4 | null |  d 
anand | 2017-04-02 | 0 | null | nil 

你可以看到时间3,2,1不到单个分区anand:2017-04-01按照desc和时间排序4,0在单个分区内anand:2017-04-02是按照desc。卡桑德拉不会照顾不同分区之间的分类。

这里是DOC:

在该表中定义,聚类列是列,它是所述化合物的主键定义的一部分,而不是第一列,它是为分区保留的位置键。列在单个分区内聚集成多行。聚类顺序由复合主键定义中列的位置确定。

来源:http://docs.datastax.com/en/cql/3.1/cql/ddl/ddl_compound_keys_c.html

通过,为什么你的数据字段是text类型和timedouble类型的方法是什么?
您可以使用date字段作为date类型和time作为timestamp类型。

+0

这些字段是根据用例设计的。我有一些问题1.我是否需要更改我的餐桌设计才能获得结果? 2.当我们通过分页查询数据时,是否有任何性能问题? –

+0

查询中可以有多少个日期? –

+0

这取决于100左右。 –

2

您正在使用的查询是o.k.但它可能不会像预期的那样行事,因为协调员不会根据分区对结果进行排序。我也偶然遇到这个问题。

它的解决方案非常简单,基本上在客户端执行需要的4个独立查询,然后在那里合并结果要好得多。总之在运营商施加了很大的压力,集群中的协调器节点,有关于这个问题的一个很好的阅读:

https://lostechies.com/ryansvihla/2014/09/22/cassandra-query-patterns-not-using-the-in-query-for-multiple-partitions/

+0

这是很难运行单独的查询。 –

+0

不应该那么辛苦,除非你使用了一些奇特的框架,即使那样。如果你使用期货,你可以很容易地链接它们。一般而言,您只需遍历“IN”中的参数即可。就像我刚开始的那一天的故事一样如果我向我的导师抱怨循环,他会对我说,其中一个是很多的特例:) –