【问题标题】:Timestamp in Cassandra卡桑德拉的时间戳
【发布时间】:2018-05-26 03:06:19
【问题描述】:

我更喜欢使用 timestamp 作为 Cassandra 中的列之一(我决定将其用作 Clustering Key)。在 Cassandra 中将列存储为时间戳的正确方法是什么?

(i.e) 像下面这样直接使用“毫秒”(例如:1513078338560)可以吗?

INSERT INTO testdata (nodeIp, totalCapacity, physicalUsage, readIOPS, readBW, writeIOPS, writeBW, writeLatency, flashMode, timestamp) VALUES('172.30.56.60',1, 1,1,1,1,1,1,'yes',1513078338560); 

或使用 dateof(now());

INSERT INTO testdata (nodeIp, totalCapacity, physicalUsage, readIOPS, readBW, writeIOPS, writeBW, writeLatency, flashMode, timestamp) VALUES('172.30.56.60',1, 1,1,1,1,1,1,'yes',dateof(now()));

在 Cassandra 中,在基于时间戳的查询中使用哪种方法更快且推荐使用?

注意:我知道它在内部存储为毫秒,我使用了'SELECT timestamp, blobAsBigint(timestampAsBlob(timestamp)) FROM'

谢谢, 哈利

【问题讨论】:

    标签: java cassandra cassandra-3.0


    【解决方案1】:

    dateof 在 Cassandra >= 2.2 中已弃用...相反,最好使用函数 toTimestamp,如下所示:toTimestamp(now())。选择的时候,如果想要获取时间戳,也可以使用toUnixTimestamp函数:

    cqlsh:test> CREATE TABLE test_times (a int, b timestamp, PRIMARY KEY (a,b));
    cqlsh:test> INSERT INTO test_times (a,b) VALUES (1, toTimestamp(now()));
    cqlsh:test> SELECT toUnixTimestamp(b) FROM test_times;
    
     system.tounixtimestamp(b)
    ---------------------------
             1513086032267
    
    (1 rows)
    
    cqlsh:test> SELECT b FROM test_times;
    
     b
    ---------------------------------
     2017-12-12 13:40:32.267000+0000
    
    (1 rows)
    

    关于性能 - 有不同的考虑:

    1. 如果您已经有时间戳作为数字,那么您可以使用它来代替调用函数
    2. 最好使用准备好的语句而不是“原始插入”——在这种情况下,Cassandra 不需要传输完整的查询,而只需传输数据,也不需要每次都解析语句。

    伪代码如下所示(类似于 Java)。

    PreparedStatement prepared = session.prepare(
        "insert into your_table (field1, field2) values (?, ?)");
    while(true) {
        session.execute(prepared.bind(value1, value2));
    }
    

    【讨论】:

    • 谢谢,我明白了你使用 toUnixTimestamp 的观点,但我没有完全明白第二点,你能简要介绍一下吗?
    • 另外,你能澄清一下像'2017-12-12 13:40:32.267000+0000'这样插入时间戳而不是毫秒/toUnitTimestamp格式的缺点吗?
    • 我不认为这应该是明显的劣势——这取决于你的代码。
    • 我接受了你的回答,我的问题是'作为默认的'时间戳'将值存储为毫秒',所以最好使用毫秒格式的时间戳(或)会有性能问题在使用时间戳作为 '2017-12-12 13:40:32.267000+0000'
    • 如果数据以字符串形式发送,则传输和解析该字符串的开销可能会稍高。关于第二次调用函数可能会导致一些开销,所以我个人更喜欢发送数字或字符串。但这实际上取决于插入的数量 - 如果不是千分之一,那么我认为使用函数是可以的。
    猜你喜欢
    • 1970-01-01
    • 2014-12-28
    • 2017-05-08
    • 2013-07-25
    • 2015-10-19
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多