如何从Cassandra获取一系列数据

时间:2014-11-18 02:38:14

标签: cassandra cqlsh

[cqlsh 5.0.1 | Cassandra 2.1.0 | CQL规范3.2.0 |原生协议v3]

table:
CREATE TABLE dc.event (
    id timeuuid PRIMARY KEY, 
    name text

) WITH bloom_filter_fp_chance = 0.01;

如何从Cassandra获取时间范围的数据?

例如,当我尝试'select * from event where id> maxTimeuuid('2014-11-01 00:05+0000') and minTimeuuid('2014-11-02 10:00+0000')'时,如http://www.datastax.com/documentation/cql/3.0/cql/cql_reference/timeuuid_functions_r.html

所示

我收到以下错误:'code=2200 [Invalid query] message="Only EQ and IN relation are supported on the partition key (unless you use the token() function)"'

我可以将timeuuid作为主键并符合要求吗?

由于

5 个答案:

答案 0 :(得分:1)

  

我可以将timeuuid作为主键并符合要求吗?

不是,不。来自http://www.datastax.com/documentation/cql/3.1/cql/cql_reference/select_r.html

  

WHERE子句可以包含大于和小于比较,   但对于给定的分区键,聚类列上的条件   仅限于允许Cassandra选择a的过滤器   行的连续排序。

您可以尝试添加"允许过滤"你的查询......但我怀疑这会有用。而且我不知道一种好方法(而且我也不相信有一种好的方法)来标记时间线。我大约99%肯定来自分区程序的排序会产生意想不到的坏结果,即使查询本身会执行并且看起来正确,直到你挖到它。

顺便说一句,您应该查看一年前提出的类似问题:time series data, selecting range with maxTimeuuid/minTimeuuid in cassandra

答案 1 :(得分:1)

简短回答,不。答案很长,你可以做类似的事情:

  

CREATE TABLE dc.event(       event_time时间戳,       id timeuuid,       姓名文字,       PRIMARY KEY(event_time,id)   )WITH bloom_filter_fp_chance = 0.01;

时间戳可能会被截断,以便它只反映一整天(或小时或分钟,具体取决于数据的速度)。您的where子句必须包含timeuuid范围中包含的时间戳的“IN”参数。

如果您使用适当的分块因子(截断您的时间戳多少),您甚至可以回答一些您正在寻找的问题而不使用一系列的时间线,只需要一个简单的where子句。

从本质上讲,这可以让你在尊重Cassandra限制的同时,提供你正在寻找的查询类型。正如Raedwald所指出的那样,你不能在连续范围内使用分区键,因为Cassandra作为一个大哈希的基础 - 也就是说,Cassandra众所周知在时间序列数据中做了一些非常强大的事情。

答案 2 :(得分:0)

看看Newts如何为范围做时间序列。作者有一套很好的幻灯片和一个描述数据模型的演讲,以准确地找到你想要的东西。 https://github.com/OpenNMS/newts/

答案 3 :(得分:0)

Cassandra无法执行此类查询,因为Cassandra是使用巨型哈希映射而非关系数据库实现的键值存储。就像内存中的哈希映射一样,在子范围内查找键值的唯一方法是遍历所有键。对于内存哈希映射而言,这可能足够昂贵,但对于Cassandra来说,这将是一种瘫痪。

答案 4 :(得分:0)

是的,您可以spark使用scalaspark-cassandra-connector来执行此操作!

我认为you shouldpartition keys设置为' YYYY-MM-dd hh:00 + 0000'并仅按日期和小时过滤。

然后你可以使用类似的东西:

case class TableKey(id: timeuuid) 
val dates = Array("2014-11-02 10:00+0000","2014-11-02 11:00+0000","2014-11-02 12:00+0000")    
val selected_data = sc.parallelize(dates).map(x => TableKey(_)).joinWithCassandraTable('dc', 'event')

您可以收集所选的数据rdd

val data = selected_data.collect

我有similar problem ...