Cassandra:为索引列的每个值选择第一个条目

时间:2015-01-08 12:38:18

标签: cassandra cql

我有一个事件表,想要为每个用户提取第一个时间戳(列unixtime)。 有没有办法用单个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 个答案:

答案 0 :(得分:1)

根据您的架构,每个用户都有一个时间戳。如果您希望每个条目有一个事件,请考虑:

PRIMARY KEY (id, unixtime).

假设这是您的架构,用户的条目将以升序的unixtime顺序存储。但是要小心......如果它是一个无界的事件流并且用户有很多事件,那么id的分区将会增长和增长。建议将分区大小保持在数十或数百兆。如果您预计会变大,那么您需要开始某种形式的分组。

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