如何删除Cassandra中的记录?

时间:2015-06-11 11:41:05

标签: cassandra cassandra-2.0 cql3

我有一张这样的表:

CREATE TABLE mytable (
    user_id int,
    device_id ascii,
    record_time timestamp,
    timestamp timeuuid,
    info_1 text,
    info_2 int, 
    PRIMARY KEY (user_id, device_id, record_time, timestamp)
);

当我要求Cassandra删除记录(列家族中的条目)时:

DELETE from my_table where user_id = X and device_id = Y and record_time = Z and timestamp = XX;

它返回时没有错误,但是当我再次查询时,记录仍然存在。现在,如果我尝试删除这样的整行:

DELETE from my_table where user_id = X

它工作并删除整行,并立即再次查询不会再从该行返回任何数据。

我做错了什么?如何在Cassandra中删除记录?

由于

2 个答案:

答案 0 :(得分:6)

好的,这是关于发生了什么的我的理论。您必须小心时间戳,因为它们将存储数据缩短到毫秒。但是,他们只会显示数据到第二个。以此示例表为例:

aploetz@cqlsh:stackoverflow> SELECT id, datetime  FROM data;

 id     | datetime
--------+--------------------------
 B25881 | 2015-02-16 12:00:03-0600
 B26354 | 2015-02-16 12:00:03-0600

(2 rows)

datetime s(类型为timestamp)是相等的,对吗?都能跟得上:

aploetz@cqlsh:stackoverflow> SELECT id, blobAsBigint(timestampAsBlob(datetime)),
                                  datetime FROM data;

 id     | blobAsBigint(timestampAsBlob(datetime)) | datetime
--------+-----------------------------------------+--------------------------
 B25881 |                           1424109603000 | 2015-02-16 12:00:03-0600
 B26354 |                           1424109603234 | 2015-02-16 12:00:03-0600

(2 rows)

正如您所知,当您使用时间戳作为PRIMARY KEY的一部分时,这会成为问题。您的时间戳可能存储的精度高于显示的精度。因此,如果您成功删除该单行,则需要提供隐藏的精度。

无论如何,你有几个选择。一,找到一种方法来确保您没有在record_time中输入超出必要的精度。或者,您可以将record_time定义为timeuuid。

同样,这是一个理论。我可能完全错了,但我看到人们这样做了几次。通常在使用dateof(now())插入时间戳数据时会发生这种情况:

INSERT INTO table (key, time, data) VALUES (1,dateof(now()),'blah blah');

答案 1 :(得分:0)

CREATE TABLE worker_login_table (
    worker_id text,
    logged_in_time timestamp, 
    PRIMARY KEY (worker_id, logged_in_time)
);

INSERT INTO worker_login_table (worker_id, logged_in_time) 
   VALUES ("worker_1",toTimestamp(now()));

1小时后再次执行上述插入语句

select * from worker_login_table;

 worker_id| logged_in_time
----------+--------------------------
 worker_1 | 2019-10-23 12:00:03+0000
 worker_1 | 2015-10-23 13:00:03+0000

(2 rows)

查询表以获取绝对时间戳

select worker_id, blobAsBigint(timestampAsBlob(logged_in_time )), logged_in_time from worker_login_table;

worker_id     | blobAsBigint(timestampAsBlob(logged_in_time)) | logged_in_time 
--------+-----------------------------------------+--------------------------
 worker_1 |                           1524109603000 | 2019-10-23 12:00:03+0000
 worker_1 |                           1524209403234 | 2019-10-23 13:00:03+0000

(2 rows)

下面的命令不会从Cassandra中删除,因为需要时间戳的精确值才能删除该条目

DELETE from worker_login_table where worker_id='worker_1' and logged_in_time ='2019-10-23 12:00:03+0000';

使用blob中的时间戳我们可以从Cassandra中删除条目

DELETE from worker_login_table where worker_id='worker_1' and logged_in_time ='1524209403234';