Cassandra - 如何进行分组查询和限制查询?
Cassandra - how to do group-by and limit query?
table 数据如下所示。 Table 在时间戳上有聚类顺序 desc,主键是 (name, timestamp):
name - address - timestamp
John - J_Addr 1 - Jan 01, 2017
John - J_Addr 2 - Feb 05, 2017
Mark - M_Addr 1 - Jan 01, 2017
Mark - M_Addr 2 - Mar 05, 2017
有没有办法获取每个名字的最新地址?
在上述情况下,预期结果将是:
name - address - timestamp
John - J_Addr 2 - Feb 05, 2017
Mark - M_Addr 2 - Mar 05, 2017
如果您使用的 cassandra 版本 >= 3.6 那么您可以使用 PER PARTITION LIMIT
示例:
SELECT * FROM table_name PER PARTITION LIMIT 1;
否则,如果您要插入当前时间的每个时间戳值,那么您可以创建另一个 table,如下所示:
CREATE TABLE user_address (
name text PRIMARY KEY,
address text
);
每当您插入到基础 table 中时,也会插入到维护的 table 中。如果你想保持这些 table.
之间的原子性,你可以使用 batch
因此每次为用户插入地址时,地址都会被更新。所以你会得到最新的地址
否则你必须从客户端扫描所有的行和组限制
table 数据如下所示。 Table 在时间戳上有聚类顺序 desc,主键是 (name, timestamp):
name - address - timestamp
John - J_Addr 1 - Jan 01, 2017
John - J_Addr 2 - Feb 05, 2017
Mark - M_Addr 1 - Jan 01, 2017
Mark - M_Addr 2 - Mar 05, 2017
有没有办法获取每个名字的最新地址? 在上述情况下,预期结果将是:
name - address - timestamp
John - J_Addr 2 - Feb 05, 2017
Mark - M_Addr 2 - Mar 05, 2017
如果您使用的 cassandra 版本 >= 3.6 那么您可以使用 PER PARTITION LIMIT
示例:
SELECT * FROM table_name PER PARTITION LIMIT 1;
否则,如果您要插入当前时间的每个时间戳值,那么您可以创建另一个 table,如下所示:
CREATE TABLE user_address (
name text PRIMARY KEY,
address text
);
每当您插入到基础 table 中时,也会插入到维护的 table 中。如果你想保持这些 table.
之间的原子性,你可以使用 batch因此每次为用户插入地址时,地址都会被更新。所以你会得到最新的地址
否则你必须从客户端扫描所有的行和组限制