[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
作为主键并符合要求吗?
由于
答案 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使用scala和spark-cassandra-connector来执行此操作!
我认为you should将partition 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 ...