使用CQL cassandra中的Where过滤器时出现奇怪的结果

时间:2012-06-21 07:51:07

标签: nosql cassandra cql nosql-aggregation

我有一个列族使用计数器作为下面的create table命令:( KEY我使用bigin来过滤查询时)。

CREATE TABLE BannerCount (
KEY bigint PRIMARY KEY
) WITH
comment='' AND
comparator=text AND
read_repair_chance=0.100000 AND
gc_grace_seconds=864000 AND
default_validation=counter AND
min_compaction_threshold=4 AND
max_compaction_threshold=32 AND
replicate_on_write='true' AND
compaction_strategy_class='SizeTieredCompactionStrategy' AND
compression_parameters:sstable_compression='SnappyCompressor';

但是当我将数据插入此列族时,并选择使用Where命令来过滤数据 结果我重新发现非常奇怪:(像那样:

使用查询:

select count(1) From BannerCount where KEY > -1

count
-------
71

使用查询:

select count(1) From BannerCount where KEY > 0;
count
-------
3

使用查询:

select count(1) From BannerCount ;
count
-------
122

我的查询会发生什么,谁告诉我为什么会这样:( :(

1 个答案:

答案 0 :(得分:2)

要了解其原因,您应该了解Cassandra的数据模型。您可能在这里使用RandomPartitioner,因此表格中的每个KEY值都会被标记为令牌值,因此它们会以分布式方式存储在您的响铃中。

因此,找到其键值大于X的所有行不是Cassandra优化的查询类型。您可能应该在其他值上键入行,然后对bigint值使用宽行(因为列已排序)或将它们放在第二列中,并在其上创建索引。

更详细地解释为什么你的结果看起来很奇怪:CQL 2隐式地将“KEY >= X”变成“token(KEY) >= token(X)”,这样一个查询器可以在某种程度上迭代所有的行 - 有效的方式。实际上,您正在查找 hash 大于X的 hash 的所有行。有关在CQL 3中如何解决这种混淆,请参阅CASSANDRA-3771那就是说,正确的解决方法是根据您希望在其上运行的查询来构建数据。

相关问题