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 以进行快速查询。
我有 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 以进行快速查询。