我想在Cassandra表中获取最后一行.怎么弄?任何的想法?
我正在开发一个项目,我用cassandra替换mysql.我想摆脱所有的SQL查询并将它们全部写在cassandra中.
Aar*_*ron 10
只是为了表达一点理解......
与所有Cassandra查询问题一样,查询需要由专门为其设计的模型提供服务.这称为基于查询的建模.查询最后插入的行不是每个表中内置的内在功能.您需要设计模型以提前支持.
例如,假设我有一个存储用户数据的表.
CREATE TABLE users (
username TEXT,
email TEXT,
firstname TEXT,
lastname TEXT,
PRIMARY KEY (username));
Run Code Online (Sandbox Code Playgroud)
如果我SELECT * FROM users LIMIT 1在这个表上运行一个,我的结果集将包含一行.该行将包含username(我的分区键)的最低散列值,因为这就是Cassandra如何在集群中存储数据.我无法知道它是否是最后添加的,所以这对你来说不是非常有用.
另一方面,假设我有一个用于跟踪用户对其帐户信息所做更新的表格.
CREATE TABLE userUpdates (
username TEXT,
lastUpdated TIMEUUID,
email TEXT,
firstname TEXT,
lastname TEXT,
PRIMARY KEY (username,lastUpdated))
WITH CLUSTERING ORDER BY (lastUpdated DESC);
Run Code Online (Sandbox Code Playgroud)
接下来我将插入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)
Run Code Online (Sandbox Code Playgroud)
如果我只是SELECT username, email, dateof(lastUpdated) FROM userupdates LIMIT 1得到Jedediah 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)
Run Code Online (Sandbox Code Playgroud)
这工作,因为我指定的集群顺序递减的lastUpdated:
WITH CLUSTERING ORDER BY (lastUpdated DESC);
Run Code Online (Sandbox Code Playgroud)
通过这种方式,每个分区中的结果将返回顶部最近最多的行,因此LIMIT 1成为查询最近行的方式.
总之,重要的是要理解:
CLUSTERING ORDER强制执行磁盘上的数据排序顺序.TL;博士; 在Cassandra中查询与MySQL或任何RDBMS的查询有很大不同.如果您需要查询最后一个上传的行(对于分区),可能有一些方法可以对表进行建模以支持它.
| 归档时间: |
|
| 查看次数: |
5982 次 |
| 最近记录: |