范围(间隔)请求在Cassandra DB - CQL中

时间:2015-06-26 23:30:08

标签: cassandra data-modeling cql cql3

借口,如果它是重复的,我在这里找到了一些关于时间范围的问题,但我的情况似乎有点不同,还没有讨论过。

我想存储相当大的数据块(blob - 2-4Mb,这是“黑盒数据”,我无法更改其布局)以使用间隔键进行访问:

...
primary key ( bin_id int, from_item_id int, to_item_id int ) 
...

能够选择项目范围,例如在此伪代码中选择包含项目间隔的所有块 [110,200]

select chunk from tb1 where chunk_id = 100500 and from_item_id >= 110 and to_item_id <= 200;

尝试运行此类查询直接以错误结束:

code=2200 [Invalid query] message="PRIMARY KEY column "to_item_id" cannot be restricted (preceding column "from_item_id" is restricted by a non-EQ relation)"

目前我找到的唯一解决方案是使用从item_id到bin_id的反向映射来实现附加表(tb_map),并使用select来使查询看起来像这样:

...
– in tb_map
primary key (dummy_id, item_id)
...
select bin_id from tb_map where dummy_id = SOME_MAGIK and item_id >= 110 and item_id <= 200;

然后使用bin_id从tb1中使用EQ或IN运算符检索块,如下所示:

select * from tb1 where bin_id in (...);

但由于插入性能问题,我无法使用此模型(应用程序应该避免对附加表进行多次插入,并且应该避免维护其他数据结构,但应该“像钉子一样简单”)。

保留在一个表(或几个简单表)中是否是一个简单的解决方案?我不知道如何在C *中模拟这样的行为(可能应该使用切片?),本地C *专家可以提供任何提示吗?

我正在使用CQL 3.1

1 个答案:

答案 0 :(得分:0)

来自CQL3 reference

  

此外,对于给定的分区键,聚类列会引起行的排序,并且它们之间的关系仅限于允许选择连续(用于排序)行集的关系。

在您的情况下,查询不会选择一组连续的行,因此Cassandra拒绝处理它。