gpt4 book ai didi

cassandra - Cassandra错误-无法限制“聚类”列(之前的列受非EQ关系限制)

转载 作者:行者123 更新时间:2023-12-03 21:23:37 25 4
gpt4 key购买 nike

我们将Cassandra用作我们的车队管理解决方案的数据历史学家。我们在Cassandra中有一个表格,其中存储了车辆行驶的详细信息。表结构如下

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


哪里:


bucketid:-分区键,是月份和年份的组合
vehicleid:-车辆的唯一ID
开始时间:-旅程的开始时间
结束时间:-旅程的结束时间
travelduration:-旅行持续时间(以毫秒为单位)


我们想运行以下查询-获取车辆的所有行驶-2015-12-1至2015-12-3之间的行车时间大于30分钟的1234567

当我运行此查询时:

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分区,然后在磁盘上按 vehicleidstarttimetravelduration排序。因为您已经在 starttime上执行范围查询(非EQ关系),所以您不能限制后面的键。这是因为 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之类的解决方案(与Cassandra一同使用)可以成功达到这一水平的报告。

只是一个旁注,但除非必须,否则不要使用 IN。使用 IN进行查询与使用二级索引相似,因为Cassandra必须与多个节点通信才能满足您的查询。用单个项目调用它可能没什么大不了的。但是 IN是那些古老的RDBMS习惯之一,您应该在深入研究Cassandra之前就应该打破它们。

关于cassandra - Cassandra错误-无法限制“聚类”列(之前的列受非EQ关系限制),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34422515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com