Cassandra中的双范围查询

时间:2012-05-07 09:54:57

标签: cassandra cql

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

现在,在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';

RowKey:a =&GT; (column = lat,value = 12,timestamp = 1336339056413000) =&GT; (column = lon,value = 4,timestamp = 1336339088170000) =&GT; (column = type,value = test,timestamp = 1336339033765000)

返回1行。

但是我在添加数千个点时非常担心性能,如果这3个列被编入索引。

1)我不得不使用索引的'type'列,因为没有它,查询失败

No indexed columns present in index clause with operator EQ

是否有可能绕过它?

2)通过lat或lon自然地对所有数据进行排序,然后只查询另一个数据,这可能很有趣,

所以只需在x和y之间执行SliceQuery,然后查询

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

要通过行名称而不是通过另一个字段(例如:String lat + lon和UTF8比较器)来订购CF,如何做到这一点?

感谢

2 个答案:

答案 0 :(得分:1)

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

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

  

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

<强>链接:

答案 1 :(得分:0)

是的,就像vladaman所说,对于Cassandra geocells来说是唯一的好方法,PythonJava