我有一个事件表,想要为每个用户提取第一个时间戳(列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);
答案 0 :(得分:1)
根据您的架构,每个用户都有一个时间戳。如果您希望每个条目有一个事件,请考虑:
PRIMARY KEY (id, unixtime).
假设这是您的架构,用户的条目将以升序的unixtime顺序存储。但是要小心......如果它是一个无界的事件流并且用户有很多事件,那么id的分区将会增长和增长。建议将分区大小保持在数十或数百兆。如果您预计会变大,那么您需要开始某种形式的分组。
现在,您的查询。总之,没有。如果您没有点击分区(通过指定分区键),则查询将成为群集范围的操作。只需很少的数据,它就可以工作。但是如果有大量数据,您将获得超时。如果您确实拥有当前形式的数据,那么我建议您使用Cassandra Spark连接器和Apache Spark来进行查询。 Spark连接的另一个好处是,如果你有cassandra节点作为spark worker节点,由于局部性,你可以有效地命中二级索引而不指定分区键(这通常会导致群集范围的查询出现超时问题等。 )。您甚至可以使用Spark获取所需的数据并将其存储到另一个cassandra表中以进行快速查询。