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

Cassandra: selecting first entry for each value of an indexed column

我有 table 个事件,想为每个用户提取第一个时间戳(第 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);

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

PRIMARY KEY (id, unixtime).

假设这是您的架构,用户的条目将按 unixtime 升序存储。不过要小心……如果它是一个无界事件流并且用户有很多事件,则 id 的分区会越来越大。建议将分区大小保持在数十或数百兆。如果您预计会更大,则需要开始某种形式的分桶。

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