如何删除Cassandra中的记录?

m.h*_*ian 2 cassandra cql3 cassandra-2.0

我有这样一张桌子:

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)
);
Run Code Online (Sandbox Code Playgroud)

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

DELETE from my_table where user_id = X and device_id = Y and record_time = Z and timestamp = XX;
Run Code Online (Sandbox Code Playgroud)

它返回没有错误,但当我再次查询时,记录仍然存在.现在,如果我尝试删除整行,如下所示:

DELETE from my_table where user_id = X
Run Code Online (Sandbox Code Playgroud)

它工作并删除整行,并立即再次查询不会再返回该行的数据.

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

谢谢

Aar*_*ron 7

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

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)
Run Code Online (Sandbox Code Playgroud)

datetime(类型为时间戳)类是相等的,是吗?不:

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)
Run Code Online (Sandbox Code Playgroud)

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

无论如何,你有几个选择.一,找到一种方法来确保你没有输入比你需要更高的精度record_time.或者,您可以定义record_time为timeuuid.

再次,这是一个理论.我可能完全错了,但我看到人们这样做了几次.通常它们在使用dateof(now())如下方式插入时间戳数据时会发生:

INSERT INTO table (key, time, data) VALUES (1,dateof(now()),'blah blah');
Run Code Online (Sandbox Code Playgroud)