Cassandra CQL使用LIMIT选择计数

时间:2016-03-23 09:53:34

标签: cassandra cql datastax

我创建了一个简单的tabe:

CREATE TABLE test (
  "type" varchar,
  "value" varchar,
  PRIMARY KEY(type,value)
);

我在其中插入了5行:

INSERT INTO test(type,value) VALUES('test','tag1')
INSERT INTO test(type,value) VALUES('test','tag2')
INSERT INTO test(type,value) VALUES('test','tag3')
INSERT INTO test(type,value) VALUES('test','tag4')
INSERT INTO test(type,value) VALUES('test','tag5')

我运行了SELECT * from test LIMIT 3,它按预期工作。

 type | value
------+------
 test |  tag1
 test |  tag2
 test |  tag3

当我跑SELECT COUNT(*) from test LIMIT 3时,它产生:

 count
-------
     5

不应该说3吗?

Datastax documentation似乎建议指定LIMIT将覆盖默认值10,000。为什么在这种情况下不起作用?如果重要的话,我在Cassandra 2.2.5上并通过cqlsh运行所有查询。

更新 Java驱动程序和CQLSH都经过测试,表明LIMIT确实无法按照文档中的规定运行。如果有任何Datastax员工阅读,我们将非常感谢您的意见。

3 个答案:

答案 0 :(得分:10)

我对此的自发回应是行计数总是只返回结果集中的一行,说明找到的行数。因此任何大于1的LIMIT都不会产生影响。

但正如@light正确指出的那样,文档说明LIMIT应该适用于count(*)。并且有充分的理由。根据{{​​3}},Cassandra无法获取任何元数据来提供数字或行,但必须检查每个分区(在每个节点上)以获得该数字。因此这是一项非常昂贵的操作。

但是,与文档相反,当使用cqlsh或使用Java驱动程序(v3.0.0)查询C * 2.2.4时,LIMIT子句对报告的行数没有影响。没有10,000行的cqlsh的默认限制。如果超过10'000,则LIMIT不大于10'000。

文档和实现似乎不同步。虽然哪一个不正确但我不能说。

修改

@Abhishek Anand引用的票证结束了this blog post。不是行为。因此,指定限制为1将计算所有行。这是理想的行为。

答案 1 :(得分:9)

这是cassandra中的一个Bug,版本2.2.x受其影响。

https://issues.apache.org/jira/browse/CASSANDRA-8216

他们已将其标记为已修复,但显然已将其传播到固定版本以外的版本。

无论如何,光明,你的假设/思考是完全正确的。 限制关键字必须应用于cassandra的计数(*),并且它在我正在使用的3.2.4和2.1.x版本中应该正常工作

答案 2 :(得分:2)

limit子句用于限制结果中的行数。 count(*)只返回一行,其中包含(在这种情况下)总行数。

“限制3”不会影响从计数(*)分析的事件数量,如果你想要这个,你最常使用的是“where”