Cassandra 错误 - 无法限制聚类列(前一列受非 EQ 关系限制)

2024-02-19

我们使用 Cassandra 作为车队管理解决方案的数据历史记录。我们在 Cassandra 中有一张表,用于存储车辆行程的详细信息。表结构如下

CREATE TABLE  journeydetails(
bucketid text,
vehicleid text,
starttime timestamp,
stoptime timestamp,
travelduration bigint,
PRIMARY KEY (bucketid,vehicleid,starttime,travelduration)
);

Where:

  1. Bucketid :- 分区键,是月份和年份的组合
  2. Vehicleid : - 车辆的唯一 ID
  3. starttime :- 旅程的开始时间
  4. endtime :- 旅程的结束时间
  5. TravelDuration:- 旅行持续时间(以毫秒为单位)

我们想运行以下查询 -获取2015年12月1日至2015年12月3日期间车辆1234567的所有行程,且行程时间大于30分钟

当我运行此查询时:

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;

我得到这个结果:

InvalidRequest: code=2200 [Invalid query] message="Clustering column "travelduration"
cannot be restricted (preceding column "starttime" is restricted by a non-EQ relation)

有人对如何解决这个问题有建议吗?


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(与 Ca​​ssandra 一起)实现这种级别的报告。

只是一个旁注,但不要使用IN除非你必须这样做。查询用IN与使用二级索引类似,Cassandra 必须与多个节点通信才能满足您的查询。用单个项目调用它可能没什么大不了的。但IN是 RDBMS 的旧习惯之一,在深入了解 Cassandra 之前,您应该真正打破它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cassandra 错误 - 无法限制聚类列(前一列受非 EQ 关系限制) 的相关文章

随机推荐