select * from journeydetails where bucketid in('2015-12') and vehicleid in('1234567')
and starttime > '2015-12-1 00:00:00' and starttime < '2015-12-3 23:59:59'
and travelduration > 1800000;
那是行不通的。原因可以追溯到 Cassandra 如何在磁盘上存储数据。 Cassandra 的想法是,它在返回具有精确键的单行或从磁盘返回连续范围的行时非常有效。
您的行按以下方式分区bucketid
,然后在磁盘上排序vehicleid
, starttime
, and travelduration
。因为您已经在执行范围查询(非 EQ 关系)starttime
,您不能限制后面的键。这是因为travelduration
限制可能会取消范围条件中某些行的资格。这会导致低效、不连续的读取。 Cassandra 旨在保护您免于编写查询(例如此查询),这可能会产生不可预测的性能。
这里有两种选择:
1-如果您可以在之前限制所有关键列travelduration
(具有等于关系),那么您可以应用大于条件:
select * from journeydetails where bucketid='2015-12' and vehicleid='1234567'
and starttime='2015-12-1 00:00:00' and travelduration > 1800000;
当然,要限制具体的starttime
可能不是很有用。
2-另一种方法是省略travelduration
全部完成,然后你原来的查询就可以工作了。
select * from journeydetails where bucketid='2015-12' and vehicleid='1234567'
and starttime > '2015-12-1 00:00:00' and starttime < '2015-12-3 23:59:59';
不幸的是,Cassandra 不提供很大程度的查询灵活性。许多人使用类似的解决方案取得了成功Spark http://spark.apache.org(与 Cassandra 一起)实现这种级别的报告。
只是一个旁注,但不要使用IN
除非你必须这样做。查询用IN
与使用二级索引类似,Cassandra 必须与多个节点通信才能满足您的查询。用单个项目调用它可能没什么大不了的。但IN
是 RDBMS 的旧习惯之一,在深入了解 Cassandra 之前,您应该真正打破它。