如何在CQL/cassandra中使用多个大于/小于条件执行查询?

如何在CQL/cassandra中使用多个大于/小于条件执行查询?,cassandra,cql,cql3,Cassandra,Cql,Cql3,我正在写一个地图应用程序。 一旦我得到地图的边界,我就必须查询数据库中的点。 结构: CREATE TABLE map.items ( id timeuuid, type int, lat double, lng double, rank int ) 创建表map.items( id timeuuid, int型, 拉特双倍, 液化天然气双倍, 秩int ) 我想这样提问: select * from map.items where type=1 an

我正在写一个地图应用程序。 一旦我得到地图的边界,我就必须查询数据库中的点。 结构:

CREATE TABLE map.items ( id timeuuid, type int, lat double, lng double, rank int ) 创建表map.items( id timeuuid, int型, 拉特双倍, 液化天然气双倍, 秩int ) 我想这样提问:

select * from map.items where type=1 and (lat > 30 and lat < 35) and (lng > 100 and lng < 110) order by rank desc limit 10; 从map.items中选择* 其中type=1 和(lat>30和lat<35) 和(lng>100和lng<110) 按等级顺序描述 限制10; 新手卡桑德拉,请帮助或提供参考。
谢谢大家!

CQL只能在一个集群键上应用范围查询,因此您无法在CQL中直接执行该操作

两种可能的方法:

  • 将Cassandra与Apache Spark配对。将该表读入RDD并应用筛选操作,以仅保留与您要查找的范围匹配的行。然后按等级进行排序操作。然后使用collect()收集并输出前十个结果

  • 或者在纯Cassandra中,按纬度对数据进行分区。例如,一个分区可能包含所有纬度>=30和<31的数据点,依此类推。然后,您的客户机将对所需的每个纬度分区(即30、31、32、33和34)执行多个查询,并在经度上使用范围查询(使用经度作为聚类列)。返回结果时,保留排名最高的十行,并丢弃其他行


  • 这两种方法都不是很好的解决方案,因为DB中的0.1度可能意味着1K点。我认为阅读和分类它们是昂贵的。方法2可能导致地图边界以外的点。也许我应该向mariaDB询问这一部分,但随着排名的不断更新,这也会很痛苦。但无论如何,谢谢你告诉我只允许一个射程条件。