Cassandra通过二级索引排序并过滤

时间:2015-09-28 10:59:57

标签: 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;

我收到以下错误:

missing EOF at 'and' (...1 ORDER BY roll_number ASC [and] age...)">

我不知道是否可以在执行订单后过滤掉结果。请告知我缺少的地方。谢谢。

1 个答案:

答案 0 :(得分:1)

  1. 请勿使用ALLOW FILTERING。它不执行或 scale,因为它允许您以它的方式查询Cassandra 不是为了支持而设计的。

  2. 当你尝试ORDER BY两件事时,CQL将你的语句解释为ORDER BY roll_number ASC and age=24。 AND属于您的WHERE子句,需要指定 之前 ORDER BY。

  3. Cassandra使用您的群集键来编写数据 磁盘排序顺序。 ORDER BY只允许您翻转排序 聚类顺序的方向(升序与降序)。所以 如果您已在表中指定了正确的排序顺序 定义,那么你不需要指定ORDER BY。

  4. 要通过IDage查询您的表格,您需要 设计你的PRIMARY KEY,将这两列作为前两列。 您只能查询PRIMARY KEY中定义的列(辅助 索引不能承受),然后只有相同的顺序(你 不能跳过键)。为此,我创建了一个查询表 (sujataByIDAndAge)看起来像这样:

  5. CREATE TABLE sujataByIDAndAge (
        ID int, 
        roll_number int, 
        age int, 
    PRIMARY KEY (ID,age,roll_number));
    

    现在插入几行后:

    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或ALLOW FILTERING:

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

    另外值得一提的是,如果结果集顺序对您很重要,那么您必须通过主键进行查询。 Cassandra仅在分区键中强制执行结果顺序(在您的情况下为ID)。