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 order by和filter through secondary Index_Cassandra_Cql - Fatal编程技术网

Cassandra order by和filter through secondary Index

Cassandra order by和filter through secondary Index,cassandra,cql,Cassandra,Cql,我的cassandra表结构如下: CREATE TABLE sujata ... (ID int, roll_number int, age int, PRIMARY KEY (ID,roll_number)); 我已经插入了一些记录,其中ID充当许多行的分区。我正在执行以下查询: SELECT count(*) FROM sujata WHERE ID=1 ORDER BY roll_number ASC and age=24 Allow Filtering; 我得到

我的cassandra表结构如下:

CREATE TABLE sujata
          ... (ID int, roll_number int, age int, PRIMARY KEY (ID,roll_number));
我已经插入了一些记录,其中ID充当许多行的分区。我正在执行以下查询:

SELECT count(*) FROM sujata WHERE ID=1 ORDER BY roll_number ASC and age=24 Allow Filtering;
我得到以下错误:

missing EOF at 'and' (...1 ORDER BY roll_number ASC [and] age...)">
我不知道在执行order by之后是否可以过滤掉结果。请告诉我我在哪里失踪。多谢各位

  • 不要使用“允许筛选”。它既不执行也不执行 缩放,因为它允许您以其固有的方式查询Cassandra 不是设计用来支持的

  • CQL将您的声明解释为按顺序执行 当您试图按两种方式订购时,滚动编号ASC和年龄=24。 AND属于WHERE子句,需要指定 在下订单之前

  • Cassandra使用集群键来编写数据的 磁盘上的排序顺序。ORDER BY仅允许您翻转排序 集群顺序的方向(升序与降序)。所以 如果已经在表中指定了正确的排序顺序 定义,则不需要指定订单依据

  • 要同时按
    ID
    age
    查询表,您需要 将这两列作为前两列来设计主键。 只能查询主键(辅键)中定义的列 索引不承受),然后仅以相同的顺序(您 不能跳过关键帧)。为此,我创建了一个查询表 (
    sujataByIDAndAge
    )如下所示:

  • 现在插入几行后:

    aploetz@cqlsh:stackoverflow> INSERT INTO sujatabyidandage  (id, roll_number, age) 
                                 VALUES (2, 20, 26);
    aploetz@cqlsh:stackoverflow> INSERT INTO sujatabyidandage  (id, roll_number, age) 
                                 VALUES (1, 100, 24);
    aploetz@cqlsh:stackoverflow> INSERT INTO sujatabyidandage  (id, roll_number, age) 
                                 VALUES (1, 110, 24);
    aploetz@cqlsh:stackoverflow> INSERT INTO sujatabyidandage  (id, roll_number, age) 
                                 VALUES (1, 190, 24);
    
    现在我可以运行您的查询了,我不需要指定ORDER BY或允许筛选:

    aploetz@cqlsh:stackoverflow> SELECT COUNT(*) FROM sujatabyidandage WHERE ID=1 AND age=24;
    
     count
    -------
         3
    
    (1 rows)
    

    同样重要的是,如果结果集顺序对您很重要,那么您必须按主键进行查询。Cassandra仅强制分区键(在您的情况下为ID)内的结果顺序。

    尝试以下操作:从sujata中选择count(*),其中ID=1,age=24按卷数排序ASC Allow Filter上述查询将不起作用,因为二级索引不支持order BY。您的建议似乎很好。但是我想要一个非主键的查询。如果这是不可能的,那么查询可能会导致一个错误,但它显示了一些缺少的EOF。你能告诉我我遗漏了什么吗?@sujata我的第二点详细说明了导致你EOF的原因。CQL希望您的语句在之前的处结束,但您的和在后面。@sujata您也可以通过根本不指定的顺序来修复它(我在第三点中提到过).我没有在我的表定义中指定排序顺序,因为我读到cassandra默认情况下按升序排序数据。根据文档,如果我在查询中指定order by,则行的检索效率更高、速度更快。如果我的查询是sujata的
    SELECT count(*),其中ID=1 order by roll_number ASC
    ,则获取600000行所需的时间仅为19s,而查询
    SELECT count(*)从ID=1和age=24的sujata获取160000行大约需要56秒。为什么这在时间上有如此巨大的差异??
    
    aploetz@cqlsh:stackoverflow> SELECT COUNT(*) FROM sujatabyidandage WHERE ID=1 AND age=24;
    
     count
    -------
         3
    
    (1 rows)