Cassandra表中的主键

时间:2016-05-26 12:47:16

标签: database cassandra

我需要创建一个Cassandra表,特定的查询将在该表上执行操作。

我需要能够根据日期范围,类型和一个或多个状态搜索此表。更具体地说,查询将如下:

从表中选择*,其中日期范围(从,到)和类型='某些类型'和状态IN(status1,status2,...,statusN)

由于Cassandra不允许对分区键进行比较操作,因此我决定将日期(在Java中为Instant类型)分解为MONTH_YEAR。例如,2015/21/12:19:02:01的日期将转换为122015(12是月份,2015年是该日期的年份)。

到目前为止,我对分区键的想法是: ((type,monthAndYear),status,date,uuid)。

因此,当我想要具有特定类型,状态和日期范围内的所有记录时,我可以执行: select * from table in type ='type'和monthAndYear IN'agendAndYear1 monthAndYear2,monthAndYear3'和status IN('status1',status2')and date> = from and date< = to。

我唯一的问题是,此查询的结果是按状态排序的(因为这是表的第一个聚类列)。我希望根据日期字段对所有记录进行排序。

如果我将状态与日期字段交换,Cassandra在比较后不允许另一个等式谓词。 如果我从群集列中删除状态字段并在其上创建索引,那么当查询中存在索引列时,Cassandra不允许在主键列中执行IN操作。

你能否就这个问题向我提出一些解决方案(如果存在的话)?

由于

1 个答案:

答案 0 :(得分:0)

您可以使用在时间字段上定义的排序创建主键((类型,状态),时间),并为列表中的每个状态执行时间范围查询,并在应用程序上合并结果。我不知道您的读取延迟要求是什么,但这应该为您提供所需的数据集。您无法从单个表中提供所有这些查询模式。查看SASI索引,也许您可​​以找到更好的解决方案。