cassandra - 如何获取 Cassandra 中最后插入的行?

标签 cassandra cql

我想获取 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/

相关文章:

cassandra - Kairosdb 未运行

hadoop - 如何从 Cassandra 加载数据到 HDFS?

Cassandra - 使用 token() 函数选择查询

sql - 为什么 Cassandra 在插入重复记录时不会报错?

Cassandra 3.9 和 CQL 规范版本

cassandra - 常见的Cassandra数据类型的字节大小是多少-在计算分区磁盘使用量时要使用?

java - NoClassDefFoundError:spark-cassandra-connector 中的 org/apache/spark/sql/DataFrame

cassandra - Apache Cassandra 替代时间序列模型,一行中有许多列

java - 如何以稳健的方式处理kafka发布失败

cassandra - 如何使用 datastax 驱动程序 session 在 cassandra 中创建带有 order by 的 cql 查询?