2015-01-08 97 views
0

我有一个事件表并希望为每个用户提取第一个时间戳(列unixtime)。 有没有办法用一个Cassandra查询来做到这一点?Cassandra:为索引列的每个值选择第一个条目

架构如下:

CREATE TABLE events (
id VARCHAR, 
unixtime bigint, 
u bigint, 
type VARCHAR, 
payload map<text, text>, 
PRIMARY KEY(id) 
); 

CREATE INDEX events_u 
    ON events (u); 

CREATE INDEX events_unixtime 
    ON events (unixtime); 

CREATE INDEX events_type 
    ON events (type); 

回答

1

根据您的模式,每个用户都会有一个时间标记。如果每个条目需要一个事件,请考虑:

PRIMARY KEY (id, unixtime). 

假设这是您的架构,用户的条目将以升序的unixtime顺序存储。但要小心......如果它是一个无限的事件流,并且用户有很多事件,则该ID的分区将会增长并增长。建议将分区大小保持在几十或几百meg。如果您预计规模较大,则需要开始某种形式的分组。

现在,在您的查询。总之,没有。如果你没有打分区(通过指定分区键),你的查询就成为一个集群操作。只需很少的数据就可以工作。但有了大量的数据,你会得到超时。如果您确实拥有目前形式的数据,那么我建议您使用Cassandra Spark连接器和Apache Spark来执行您的查询。 spark连接器的一个额外好处是,如果cassandra节点作为spark工具节点,由于局部性,可以在不指定分区键的情况下高效地创建二级索引(这通常会导致带有超时问题的集群范围查询等。 )。您甚至可以使用Spark获取所需的数据并将其存储到另一个cassandra表中以便快速查询。

+0

谢谢你的回答。我相信存在一个误解:'id'是事件的唯一标识符,但它是包含userid的'u'字段。所以也许你想提出的是'PRIMARY KEY(u,unixtime)'? – fstab

+0

不幸的是,即使在创建'PRIMARY KEY(u,unixtime)'后,我运行查询'select u,unixtime from events ORDER BY u,unixtime;'我得到错误'code = 2200 [Invalid query] message =“只有在分区键被EQ或IN限制时才支持ORDER BY。“关于为什么会发生这种情况的任何想法?谢谢! – fstab

+1

是...排序是通过聚类列完成的。所以你需要打一个分区。如果这是一份报告,请按照我上面的建议使用Spark。 – ashic

相关问题