【问题标题】:Delete Rows using timestamp column cassandra使用时间戳列 cassandra 删除行
【发布时间】:2018-11-28 16:57:41
【问题描述】:

我想从我的表中删除时间戳之间的数据。

CREATE TABLE propatterns_test.test (
clientId text,
meterId text,
meterreading text,
date timestamp,
PRIMARY KEY (meterId, date) );

我的删除查询是:

DELETE FROM test  WHERE meterid = 'M5' AND date > '2016-12-27 10:00:00+0000';

返回此错误:

InvalidRequest: Error from server: code=2200 [Invalid query] 
    message="Invalid operator < for PRIMARY KEY part date"

之后我尝试删除特定行:

DELETE FROM test  WHERE meterid = 'M5' AND date = '2016-12-27 09:42:30+0000';

实际上表中包含相同的记录,但并没有被删除。

这是我的数据的样子:

 meterid | date                     | clientid | meterreading
---------+--------------------------+----------+--------------
      M5 | 2016-12-27 09:42:30+0000 |      RDS |      35417.8
      M5 | 2016-12-27 09:42:44+0000 |      RDS |      35417.8
      M5 | 2016-12-27 09:47:20+0000 |      RDS |      35417.8
      M5 | 2016-12-27 09:47:33+0000 |      RDS |      35417.8

没有从表中删除。那么如何删除作为主键一部分的时间戳日期之间的数据?

【问题讨论】:

    标签: cassandra cassandra-2.0


    【解决方案1】:

    我看到这里发生了几件事。首先,就像 iconnj 提到的那样,在 Cassandra 3.0 之前的版本中,范围删除是不可能的。

    其次,您的单行删除尝试失败(我相信),因为您没有考虑时间戳上的毫秒数。如果您将 date 列嵌套在 timestsampasblobblobasbigint 函数中,您可以看到这一点:

    aploetz@cqlsh:stackoverflow> SELECT meterid,date,blobAsBigint(timestampAsBlob(date)) 
        FROM propatterns WHERE meterid='M5';
    
     meterid | date                     | system.blobasbigint(system.timestampasblob(date))
    ---------+--------------------------+---------------------------------------------------
          M5 | 2016-12-27 09:42:30+0000 |                                     1482831750000
          M5 | 2016-12-30 17:31:53+0000 |                                     1483119113231
          M5 | 2016-12-30 17:32:08+0000 |                                     1483119128812
    
    (3 rows)
    

    注意2016-12-27 09:42:30+0000 行末尾的零,我从您的示例中明确插入。请注意,我使用 dateof(now()) 嵌套函数插入的两行实际上将毫秒作为时间戳的最后三位数字。

    当我删除其中一行时,看看当我取这三个数字并将它们添加为毫秒时会发生什么:

    aploetz@cqlsh:stackoverflow> DELETE FROM propatterns WHERE meterid='M5'
        AND date='2016-12-30 17:32:08.812+0000';
    aploetz@cqlsh:stackoverflow> SELECT meterid,date,blobAsBigint(timestampAsBlob(date))
        FROM propatterns WHERE meterid='M5';
    
     meterid | date                     | system.blobasbigint(system.timestampasblob(date))
    ---------+--------------------------+---------------------------------------------------
          M5 | 2016-12-27 09:42:30+0000 |                                     1482831750000
          M5 | 2016-12-30 17:31:53+0000 |                                     1483119113231
    
    (2 rows)
    

    总结:

    • 您无法在 Cassandra 3.0 之前执行范围删除。
    • 如果毫秒确实存在,您不能在不指定毫秒的情况下删除以时间戳为键的单个行。

    【讨论】:

      【解决方案2】:

      从 C* 3.0 开始,可以使用范围删除子句。查看您收到的错误,我认为您使用的是 3.0 之前的版本,在这种情况下您将无法通过 CQL 执行此操作

      【讨论】:

        【解决方案3】:

        在 Cassandra 3 中,您可以使用 "...from Y using timestamp XXX where ..." 命令:

        create table mytime (
            location_id text,
            tour_id text,
            mytime timestamp,
        PRIMARY KEY (location_id, tour_id));
        
        INSERT INTO mytime (location_id, tour_id, mytime) values ('location1', '1', toTimeStamp(now()));
        INSERT INTO mytime (location_id, tour_id, mytime) values ('location1', '2', toTimeStamp(now()));
        

        注意:您需要用于时间戳的值是纳秒而不是毫秒:

        select location_id, mytime, blobAsBigint(mytime), WRITETIME(mytime) from mytime;
        
        location_id |mytime                  |system.blobasbigint(mytime) |writetime(mytime) |
        ------------|------------------------|----------------------------|------------------|
        location1   |2018-11-28-09.53.52.110 |1543395232110               |1543395232109517  |
        location1   |2018-11-28-09.53.52.742 |1543395232742               |1543395232740055  |
        

        所以现在你可以做

        delete from mytime using timestamp 1543395232109517 where location_id = 'location1';
        

        正确删除条目

        select location_id, mytime, blobAsBigint(mytime), WRITETIME(mytime) from mytime;
        
        location_id |mytime                  |system.blobasbigint(mytime) |writetime(mytime) |
        ------------|------------------------|----------------------------|------------------|
        location1   |2018-11-28-09.53.52.742 |1543395232742               |1543395232740055  |
        

        【讨论】:

        • USING TIMESTAMP 不同 - 它为操作本身设置时间戳,因此对作者没有帮助...
        猜你喜欢
        • 2017-05-27
        • 1970-01-01
        • 2013-08-02
        • 2017-04-30
        • 1970-01-01
        • 2017-04-02
        • 1970-01-01
        • 2016-05-04
        • 1970-01-01
        相关资源
        最近更新 更多