2016-05-26 35 views
0

我需要创建一个Cassandra表,其中特定的查询将采取行动。Cassandra表中的主键

我需要能够根据日期范围,类型和一个或多个状态在此表上进行搜索。更具体地,该查询将是这样的:

SELECT * FROM表,其中日期范围(从,到)和类型= '一些类型' 和状态IN(STATUS1,STATUS2,...,statusN)

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

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

所以,当我想有一个特定的类型,状态和日期范围内的所有记录,我可以执行: SELECT * FROM表其中type =“类型”和monthAndYear IN“monthAndYear1 monthAndYear2,monthAndYear3”和状态IN('status1',status2')和日期> =来自并且日期< = to。

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

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

你能否建议我解决一些问题(如果有的话)?

感谢

+0

http://stackoverflow.com/help/mcve **代码** – theblindprophet

回答

0

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