我想获取 Cassandra 表中最后插入的行。如何获得?任何想法?
我正在开发一个项目,我将用 cassandra 替换 mysql。我想摆脱所有 sql 查询并将它们全部写在 cassandra 中。
最佳答案
只是为了传达一点理解......
与所有 Cassandra 查询问题一样,查询需要由专门为其设计的模型提供服务。这称为基于查询的建模。查询最后插入的行并不是每个表内置的固有功能。您需要提前设计模型来支持这一点。
例如,假设我有一个存储用户数据的表。
CREATE TABLE users (
username TEXT,
email TEXT,
firstname TEXT,
lastname TEXT,
PRIMARY KEY (username));
如果我在此表上运行SELECT * FROM users LIMIT 1
,我的结果集将包含一行。该行将是包含用户名(我的分区键)的最低哈希值的行,因为这就是 Cassandra 在集群中存储数据的方式。我无法知道它是否是最后添加的,因此这对您来说不是很有用。
另一方面,假设我有一个表格,旨在跟踪用户对其帐户信息所做的更新。
CREATE TABLE userUpdates (
username TEXT,
lastUpdated TIMEUUID,
email TEXT,
firstname TEXT,
lastname TEXT,
PRIMARY KEY (username,lastUpdated))
WITH CLUSTERING ORDER BY (lastUpdated DESC);
接下来我将更新插入 3 行:
> INSERT INTO userUpdates (username,lastUpdated,email,firstname,lastname)
VALUES ('bkerman',now(),'bkerman@ksp.com','Bob','Kerman');
> INSERT INTO userUpdates (username,lastUpdated,email,firstname,lastname)
VALUES ('jkerman',now(),'jkerman@ksp.com','Jebediah','Kerman');
> INSERT INTO userUpdates (username,lastUpdated,email,firstname,lastname)
VALUES ('bkerman',now(),'bobkerman@ksp.com','Bob','Kerman');
> SELECT username, email, dateof(lastUpdated) FROM userupdates;
username | email | system.dateof(lastupdated)
----------+-------------------+----------------------------
jkerman | jkerman@ksp.com | 2016-02-17 15:31:39+0000
bkerman | bobkerman@ksp.com | 2016-02-17 15:32:22+0000
bkerman | bkerman@ksp.com | 2016-02-17 15:31:38+0000
(3 rows)
如果我只是从 userupdates LIMIT 1 中选择用户名、电子邮件、日期(lastUpdated)
,我将获得 Jeedediah Kerman 的数据,该数据不是最近更新的。但是,如果我将分区限制为 username='bkerman'
,并使用 LIMIT 1
,我将获得 Bob Kerman 的最新行。
> SELECT username, email, dateof(lastUpdated) FROM userupdates WHERE username='bkerman' LIMIT 1;
username | email | system.dateof(lastupdated)
----------+-------------------+----------------------------
bkerman | bobkerman@ksp.com | 2016-02-17 15:32:22+0000
(1 rows)
这是有效的,因为我在lastUpdated
上指定了降序的聚类顺序:
WITH CLUSTERING ORDER BY (lastUpdated DESC);
这样,每个分区内的结果将在顶部返回,并且最近插入的行位于顶部,因此 LIMIT 1
成为查询最新行的方式。
总之,重要的是要了解:
- Cassandra 通过分区键的哈希值对集群中的数据进行排序。这有助于确保更均匀的数据分布。
- Cassandra
CLUSTERING ORDER
强制分区键内数据的磁盘排序顺序。 - 虽然您无法获取每个表的最近更新插入的行,但您可以设计模型以针对每个分区返回该行。
tl;dr; Cassandra 中的查询与 MySQL 或任何 RDBMS 中的查询有很大不同。如果您需要查询最后插入的行(对于分区),那么您可能可以通过多种方式对表进行建模来支持它。
关于cassandra - 如何获取 Cassandra 中最后插入的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35453141/