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取代.
您可以在insert语句中使用TIMESTAMP子句将数据标记为最新:
使用TIMESTAMP标记插入的数据(写入时间).输入自纪元(1970年1月1日)以来的时间(以微秒为单位).默认情况下,Cassandra使用实际写入时间.
dt_time从主键中删除只存储imei和的一个条目
在这种情况下,select by imei将返回具有最新时间戳的记录(从第1点开始).
请注意,如果您的dt_time(将指定为时间戳)小于当前时间,则此方法将起作用.换句话说,select query将返回具有最新时间戳但在当前时间之前的记录.如果插入时间戳大于当前时间的数据,则在此时间戳到来之前您将看不到此数据.
首先,要仅存储表中的最后一个条目,您需要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)
这有几个问题:
如果条目尚不存在,它将不起作用 - 在这种情况下,您可以尝试INSERT ... IF NOT EXISTS在尝试更新之前使用,或者用emei数字预先填充数据库
轻量级事务会给集群带来开销,因为数据应该在写入之前读取,这可能会给服务器带来很大的负载,并降低吞吐量。
| 归档时间: |
|
| 查看次数: |
108 次 |
| 最近记录: |