3

我有一个列族使用计数器作为下面的创建表命令:(查询时我使用 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

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

4

1 回答 1

2

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

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

更详细地解释一下为什么你的结果看起来很奇怪:CQL 2 隐式地将 " KEY >= X" 转换为 " token(KEY) >= token(X)",以便查询器可以以某种有效的方式遍历所有行。所以实际上,您会找到所有哈希值大于X哈希值的行。请参阅CASSANDRA-3771了解如何在 CQL 3 中解决这种混淆。也就是说,正确的解决方法是根据您希望在其上运行的查询。

于 2012-06-21T17:32:03.107 回答