我的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...)">
我不知道是否可以在执行订单后过滤掉结果。请告知我缺少的地方。谢谢。
答案 0 :(得分:1)
请勿使用ALLOW FILTERING。它不执行或 scale,因为它允许您以它的方式查询Cassandra 不是为了支持而设计的。
当你尝试ORDER BY两件事时,CQL将你的语句解释为ORDER BY
roll_number ASC and age=24
。
AND属于您的WHERE子句,需要指定
之前 ORDER BY。
Cassandra使用您的群集键来编写数据 磁盘排序顺序。 ORDER BY只允许您翻转排序 聚类顺序的方向(升序与降序)。所以 如果您已在表中指定了正确的排序顺序 定义,那么你不需要指定ORDER BY。
要通过ID
和age
查询您的表格,您需要
设计你的PRIMARY KEY,将这两列作为前两列。
您只能查询PRIMARY KEY中定义的列(辅助
索引不能承受),然后只有相同的顺序(你
不能跳过键)。为此,我创建了一个查询表
(sujataByIDAndAge
)看起来像这样:
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)。