如何只存储Cassandra最近的条目?

Raj*_*gir 2 cassandra datastax-enterprise datastax cassandra-3.0

我有一张Cassandra表: -

create table test(imei text,dt_time timestamp, primary key(imei, dt_time)) WITH CLUSTERING ORDER BY (dt_time DESC);

Partition Key is: imei
Clustering Key is: dt_time
Run Code Online (Sandbox Code Playgroud)

现在,我想在每个分区键中仅存储此表中的最新条目(按时间).假设我在表中插入条目,每个imei都会有单个条目

现在让我们说一个imei 98838377272 dt_time是2017-12-23 16.20.12现在对于相同的imei,如果dt_time像2017-12-23 15.20.00那么这个条目不应该插入那个Cassandra表中.

但是如果时间到了2017-12-23 17.20.00那么它应该得到插入,前一行应该被这个dt_time取代.

Mik*_*eev 6

您可以在insert语句中使用TIMESTAMP子句将数据标记为最新:

使用TIMESTAMP标记插入的数据(写入时间).输入自纪元(1970年1月1日)以来的时间(以微秒为单位).默认情况下,Cassandra使用实际写入时间.

dt_time从主键中删除只存储imei和的一个条目

  1. 插入数据并指定时间戳为2017-12-23 16.20.12
  2. 插入数据并指定时间戳为2017-12-23 15.20.00

在这种情况下,select by imei将返回具有最新时间戳的记录(从第1点开始).

请注意,如果您的dt_time(将指定为时间戳)小于当前时间,则此方法将起作用.换句话说,select query将返回具有最新时间戳但在当前时间之前的记录.如果插入时间戳大于当前时间的数据,则在此时间戳到来之前您将看不到此数据.


Ale*_*Ott 5

首先,要仅存储表中的最后一个条目,您需要dt_time从主键中删除- 否则您会为每个时间戳将条目插入到 DB 中。

Cassandra 支持所谓的轻量级事务,允许在插入数据之前检查数据。

因此,如果您只想在dt_time小于新时间时更新条目,则可以使用以下内容:

首先插入数据:

> insert into test(imei, dt_time) values('98838377272', '2017-12-23 15:20:12');
Run Code Online (Sandbox Code Playgroud)

尝试同时更新数据,或者它可能更小

> update test SET dt_time = '2017-12-23 15:20:12' WHERE imei = '98838377272' 
   IF dt_time < '2017-12-23 15:20:12';

 [applied] | dt_time
-----------+---------------------------------
     False | 2017-12-23 15:20:12.000000+0000
Run Code Online (Sandbox Code Playgroud)

这将失败,因为它是从applied等于看到的False。我可以用更大的时间戳更新它,它将被更新:

> update test SET dt_time = '2017-12-23 15:20:12' WHERE imei = '98838377272' 
   IF dt_time < '2017-12-23 16:21:12';

 [applied]
-----------
      True
Run Code Online (Sandbox Code Playgroud)

这有几个问题:

  1. 如果条目尚不存在,它将不起作用 - 在这种情况下,您可以尝试INSERT ... IF NOT EXISTS在尝试更新之前使用,或者用emei数字预先填充数据库

  2. 轻量级事务会给集群带来开销,因为数据应该在写入之前读取,这可能会给服务器带来很大的负载,并降低吞吐量。