Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cassandra CLUSTERING ORDER BY不起作用,并以正确的结果显示_Cassandra_Cql_Cassandra 3.0 - Fatal编程技术网

Cassandra CLUSTERING ORDER BY不起作用,并以正确的结果显示

Cassandra CLUSTERING ORDER BY不起作用,并以正确的结果显示,cassandra,cql,cassandra-3.0,Cassandra,Cql,Cassandra 3.0,嗨,我已经创建了一个表来存储类似的数据 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); 并将数据插入表中。但这样的查询会产生无序的结果 SELECT * FROM keyspace.test where device_i

嗨,我已经创建了一个表来存储类似的数据

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);
并将数据插入表中。但这样的查询会产生无序的结果

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

我的表设计有问题吗。

我想你误解了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中排序。Cassandra将不负责不同分区之间的排序

这是文件:

在表定义中,集群列是复合主键定义的一部分,但不是第一列,第一列是为分区键保留的位置。列在单个分区内的多行中聚集。聚类顺序由列在复合主键定义中的位置决定

资料来源:

顺便问一下,为什么您的数据字段是
text
类型而
time
字段是
double
类型?

您可以将
日期
字段用作
日期
类型,将
时间
字段用作
时间戳
类型

您正在使用的查询没有问题,但它的行为可能与您期望的不一样,因为协调器不会根据分区对结果进行排序。我也遇到过几次这个问题

解决方案非常简单,基本上最好是在客户端上执行所需的4个独立查询,然后在那里合并结果。简言之,操作员对集群中的协调器节点施加了很大压力,关于这个主题有一个很好的解读:


举个例子,说明你没有得到分类结果,没有自我宣传或其他什么,但我在2015年写了一篇关于这个主题的文章,这可能会有所帮助:@Aaron我读过你的博客。是否有其他方法来保存我的问题?字段是根据用例设计的。我有一些问题1.为了得到结果,我需要改变我的表格设计吗?2.当我们在分页关闭的情况下查询数据时,是否有任何性能问题?这取决于,大约100。那么您不应该在查询中使用。使用executeAsync(您可以控制每次执行一个异步查询的数量)或更改数据模型。并行执行异步执行查询。因此,一次执行太多executeAsync会给集群带来压力。检查这个答案:运行单独的查询是非常困难的。除非你使用了一些奇特的框架,否则应该不会那么困难,即使是这样。如果你正在使用期货,你可以很容易地将其链接起来。通常,您只需在中的
中迭代参数。正如我刚开始工作时的一个附带故事,如果我向导师抱怨循环,他会对我说,一个是许多循环的特例:)@MarkoŠvaljek好吧,如果你需要排序和分页的数据,那么客户端排序就不是一个选项。