卡桑德拉的时间戳

时间:2017-12-12 12:18:29

标签: java cassandra cassandra-3.0

我更喜欢使用时间戳作为Cassandra中的一个列(我决定将其用作群集键)。这是在Cassandra中将列存储为时间戳的正确方法吗?

)是否可以直接使用'毫秒'(例如: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'

谢谢, 哈利

1 个答案:

答案 0 :(得分:3)

在Cassandra> = 2.2中不推荐使用dateof ...而是使用函数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. 最好使用预备语句而不是" raw inserts" - 在这种情况下,Cassandra不需要传输完整的查询,但只需要传输数据,而且每次都不需要解析语句。
  3. 伪代码看起来如下(类似Java)。

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