Cassandra 中的时间戳
Timestamp in Cassandra
我更喜欢使用 timestamp 作为 Cassandra 中的列之一(我决定将其用作集群键)。在 Cassandra 中将列存储为时间戳的正确方法是什么?
(i.e) 像下面这样直接使用 'milliseconds'(例如: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'
谢谢,
哈利
在 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)
关于性能 - 有不同的考虑因素:
- 如果您已经将时间戳作为数字,那么您可以使用它而不是调用函数
- 最好使用准备好的语句而不是 "raw inserts" - 在这种情况下,Cassandra 不需要传输完整的查询,而只需要传输数据,也不需要每次都解析语句。
伪代码如下所示(类似于Java)。
PreparedStatement prepared = session.prepare(
"insert into your_table (field1, field2) values (?, ?)");
while(true) {
session.execute(prepared.bind(value1, value2));
}
我更喜欢使用 timestamp 作为 Cassandra 中的列之一(我决定将其用作集群键)。在 Cassandra 中将列存储为时间戳的正确方法是什么?
(i.e) 像下面这样直接使用 'milliseconds'(例如: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'
谢谢, 哈利
在 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)
关于性能 - 有不同的考虑因素:
- 如果您已经将时间戳作为数字,那么您可以使用它而不是调用函数
- 最好使用准备好的语句而不是 "raw inserts" - 在这种情况下,Cassandra 不需要传输完整的查询,而只需要传输数据,也不需要每次都解析语句。
伪代码如下所示(类似于Java)。
PreparedStatement prepared = session.prepare(
"insert into your_table (field1, field2) values (?, ?)");
while(true) {
session.execute(prepared.bind(value1, value2));
}