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

时间:2016-02-17 09:50:31

标签: cassandra cql

我想在Cassandra表中获取最后一行。怎么弄?任何的想法?

我正在开发一个项目,我用cassandra替换mysql。我想摆脱所有的SQL查询并将它们全部写在cassandra中。

2 个答案:

答案 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成为查询最近行的方式。

总之,重要的是要理解:

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

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

答案 1 :(得分:2)

  

我想在Cassandra表中获取最后一行。怎么弄?任何的想法?

这是不可能的,你要求的是队列模式(给我最后一条消息),队列是 Cassandra

的已知反模式