如何在Cassandra中获取最后一行?

Moh*_*ish 8 cql cassandra

我想在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成为查询最近行的方式.

总之,重要的是要理解:

  • Cassandra通过分区键的散列值对集群中的数据进行排序.这有助于确保更均匀的数据分发.
  • Cassandra 分区键中CLUSTERING ORDER强制执行磁盘上的数据排序顺序.
  • 虽然您无法为每个表获取最近最多的行,但您可以设计模型以便为每个分区返回该行.

TL;博士; 在Cassandra中查询与MySQL或任何RDBMS的查询有很大不同.如果您需要查询最后一个上传的行(对于分区),可能有一些方法可以对表进行建模以支持它.


doa*_*hai 1

我想获取 Cassandra 表中最后插入的行。如何获得?任何想法?

这是不可能的,您请求的是队列模式(给我最后一条消息),而队列是Cassandra的已知反模式