Cassandra order by和filter through secondary Index
我的cassandra表结构如下: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; 我得到
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之后是否可以过滤掉结果。请告诉我我在哪里失踪。多谢各位
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)