如何删除Cassandra中的一条记录?
How to delete a record in Cassandra?
我有一个 table 这样的:
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 像这样删除一条记录(columnfamily 中的一个条目)时:
DELETE from my_table where user_id = X and device_id = Y and record_time = Z and timestamp = XX;
它return没有错误,但是当我再次查询时记录仍然存在。现在,如果我尝试像这样删除整行:
DELETE from my_table where user_id = X
它有效并删除了整行,并且立即再次查询不会return该行中的任何更多数据。
我做错了什么?如何在 Cassandra 中删除记录?
谢谢
好的,这是我对正在发生的事情的理论。您必须小心使用时间戳,因为它们将 store 数据精确到毫秒。但是,他们只会 显示 数据到秒。以此样本table为例:
aploetz@cqlsh:Whosebug> 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
个(时间戳类型)相等,对吧?没有:
aploetz@cqlsh:Whosebug> 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');
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)
查询 table 以获得绝对时间戳
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';
我有一个 table 这样的:
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 像这样删除一条记录(columnfamily 中的一个条目)时:
DELETE from my_table where user_id = X and device_id = Y and record_time = Z and timestamp = XX;
它return没有错误,但是当我再次查询时记录仍然存在。现在,如果我尝试像这样删除整行:
DELETE from my_table where user_id = X
它有效并删除了整行,并且立即再次查询不会return该行中的任何更多数据。
我做错了什么?如何在 Cassandra 中删除记录?
谢谢
好的,这是我对正在发生的事情的理论。您必须小心使用时间戳,因为它们将 store 数据精确到毫秒。但是,他们只会 显示 数据到秒。以此样本table为例:
aploetz@cqlsh:Whosebug> 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
个(时间戳类型)相等,对吧?没有:
aploetz@cqlsh:Whosebug> 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');
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)
查询 table 以获得绝对时间戳
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';