Cassandra中的双范围查询

Posted

技术标签:

【中文标题】Cassandra中的双范围查询【英文标题】:Double range query in Cassandra 【发布时间】:2012-05-07 09:54:56 【问题描述】:

我想执行一个双范围查询以获得一个点附近的纬度和经度点,

现在在 Cassandra 中似乎可行,我刚刚尝试过

create column family users
 with comparator=UTF8Type
 AND key_validation_class=UTF8Type
 and column_metadata=[column_name: full_name, validation_class: UTF8Type,
 column_name: type, validation_class: UTF8Type, index_type: KEYS,
 column_name: lat, validation_class: LongType, index_type: KEYS,
 column_name: lon, validation_class:  LongType, index_type: KEYS];

SET users['a']['type']='test';                                             
SET users['b']['type']='test';
SET users['c']['type']='test';
SET users['a']['lat']='12';                                                
SET users['b']['lat']='9'; 
SET users['c']['lat']='12';
SET users['b']['lon']='1'; 
SET users['a']['lon']='4';
SET users['c']['lon']='2';
get users where type = 'test' and lon < '6' and lon > '3' and lat > '10' and lat < '13';

行键:一个 =>(列=纬度,值=12,时间戳=1336339056413000) =>(列=lon,值=4,时间戳=1336339088170000) =>(列=类型,值=测试,时间戳=1336339033765000)

返回 1 行。

但是我很担心添加数千点时的性能,如果这 3 列被索引。

1) 我必须使用索引的“类型”列,因为没有它,查询会失败

No indexed columns present in index clause with operator EQ

可以绕过吗?

2) 自然地按纬度或经度对所有数据进行排序可能会很有趣,然后只查询另一个,

所以只需对 x 和 y 之间的 lat 进行 SliceQuery,然后进行查询

get users where type = 'test' and lon < '6' and lon > '3';

不按行名而是按另一个字段(例如:字符串 lat+lon 和 UTF8 比较器)对 CF 进行排序,如何做到这一点?

谢谢

【问题讨论】:

澄清可能是一个重要的初步误解:这些都不是 CQL。您正在使用 cassandra-cli 工具的特殊语法。 【参考方案1】:

您的解决方案可能适用于较小的数据集。一旦它增长,您需要一些空间索引来执行快速查找。 Cassandra 目前不支持空间索引。我建议你看看 GeoCell / GeoHash

您为每个点坐标创建哈希,然后您可以对字符串执行范围查询。在这种情况下,Cassandra 范围查询将是一个不错的选择。

GeoHash是一种分层空间数据结构,将空间细分为网格形状的桶。

链接:

geohashing ***:http://en.wikipedia.org/wiki/Geohash Java 实现http://code.google.com/p/javageomodel/

【讨论】:

【参考方案2】:

是的,就像 vladaman 所说,Cassandra geocells 是(唯一?)好方法,在 Python 或 Java 中

【讨论】:

以上是关于Cassandra中的双范围查询的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Cassandra 在获取数据时响应缓慢而不是拆分到不同的范围查询?

用于范围查询的 cassandra 的表定义语句?

Spark Cassandra 连接器 - 分区键上的范围查询

如何按数据范围查询 Cassandra 中以 TimeUUID 为第一个组件的复合列?

DSE (Cassandra) - int 数据类型的范围搜索

Cassandra-2.1.2 中的范围扫描需要大量时间