我想在Cassandra表中获取最后一行。怎么弄?任何的想法?
我正在开发一个项目,我用cassandra替换mysql。我想摆脱所有的SQL查询并将它们全部写在cassandra中。
答案 0 :(得分:10)
只是为了表达一点理解......
与所有Cassandra查询问题一样,查询需要由专门为其设计的模型提供服务。这称为基于查询的建模。查询最后插入的行不是每个表中内置的内在功能。您需要设计模型以提前支持。
例如,假设我有一个存储用户数据的表。
CREATE TABLE users (
username TEXT,
email TEXT,
firstname TEXT,
lastname TEXT,
PRIMARY KEY (username));
如果我在此表上运行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);
接下来我将插入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)
如果我只是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)
这很有效,因为我在lastUpdated
上指定了降序的聚类顺序:
WITH CLUSTERING ORDER BY (lastUpdated DESC);
通过这种方式,每个分区中的结果将返回顶部最近最多的行,因此LIMIT 1
成为查询最近行的方式。
总之,重要的是要理解:
CLUSTERING ORDER
在分区键中强制执行数据的磁盘排序顺序。tl; dr; 在Cassandra中查询与MySQL或任何RDBMS的查询有很大不同。如果您需要查询上一个上传的行(对于分区),可能有一些方法可以对表进行建模以支持它。
答案 1 :(得分:2)
我想在Cassandra表中获取最后一行。怎么弄?任何的想法?
这是不可能的,你要求的是队列模式(给我最后一条消息),队列是 Cassandra
的已知反模式