Wil*_*llZ 21 timestamp cql cassandra cqlsh
我正在插入带有时间戳列的Cassandra表.我的数据具有微秒精度,因此时间数据字符串如下所示:
2015-02-16T18:00:03.234 + 00:00
但是,在运行select查询的cqlsh中,没有显示微秒数据,我只能看到时间下降到第二精度.在234微秒数据未示出.
我想我有两个问题:
1)Cassandra是否使用时间戳数据类型捕获微秒?我的猜测是肯定的?
2)如何通过cqlsh验证?
表定义:
create table data (
datetime timestamp,
id text,
type text,
data text,
primary key (id, type, datetime)
)
with compaction = {'class' : 'DateTieredCompactionStrategy'};
Run Code Online (Sandbox Code Playgroud)
使用Java PreparedStatment运行插入查询:
insert into data (datetime, id, type, data) values(?, ?, ?, ?);
Run Code Online (Sandbox Code Playgroud)
选择查询只是:
select * from data;
Run Code Online (Sandbox Code Playgroud)
Aar*_*ron 46
为了回答你的问题,我对这个问题进行了一些挖掘.
微秒不,毫秒是.如果我创建表,插入一行,并尝试通过截断时间查询它,它不起作用:
aploetz@cqlsh:stackoverflow> INSERT INTO data (datetime, id, type, data)
VALUES ('2015-02-16T18:00:03.234+00:00','B26354','Blade Runner','Deckard- Filed and monitored.');
aploetz@cqlsh:stackoverflow> SELECT * FROM data
WHERE id='B26354' AND type='Blade Runner' AND datetime='2015-02-16 12:00:03-0600';
id | type | datetime | data
----+------+----------+------
(0 rows)
Run Code Online (Sandbox Code Playgroud)
但是当我在指定毫秒时查询相同的值id和type值时:
aploetz@cqlsh:stackoverflow> SELECT * FROM data
WHERE id='B26354' AND type='Blade Runner' AND datetime='2015-02-16 12:00:03.234-0600';
id | type | datetime | data
--------+--------------+--------------------------+-------------------------------
B26354 | Blade Runner | 2015-02-16 12:00:03-0600 | Deckard- Filed and monitored.
(1 rows)
Run Code Online (Sandbox Code Playgroud)
所以毫秒肯定存在.为此问题创建了一个JIRA票证(CASSANDRA-5870),但它被解决为"无法修复".
实际验证毫秒确实存在的一种可能方法是将timestampAsBlob()函数嵌套在其中blobAsBigint(),如下所示:
aploetz@cqlsh:stackoverflow> SELECT id, type, blobAsBigint(timestampAsBlob(datetime)),
data FROM data;
id | type | blobAsBigint(timestampAsBlob(datetime)) | data
--------+--------------+-----------------------------------------+-------------------------------
B26354 | Blade Runner | 1424109603234 | Deckard- Filed and monitored.
(1 rows)
Run Code Online (Sandbox Code Playgroud)
虽然不是最佳,但在这里你可以清楚地看到最后的毫秒值"234".如果我为同一个时间戳添加一行,但没有毫秒,这就更加明显了:
aploetz@cqlsh:stackoverflow> INSERT INTO data (id, type, datetime, data)
VALUES ('B25881','Blade Runner','2015-02-16T18:00:03+00:00','Holden- Fine as long as nobody unplugs him.');
aploetz@cqlsh:stackoverflow> SELECT id, type, blobAsBigint(timestampAsBlob(datetime)),
... data FROM data;
id | type | blobAsBigint(timestampAsBlob(datetime)) | data
--------+--------------+-----------------------------------------+---------------------------------------------
B25881 | Blade Runner | 1424109603000 | Holden- Fine as long as nobody unplugs him.
B26354 | Blade Runner | 1424109603234 | Deckard- Filed and monitored.
(2 rows)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
26074 次 |
| 最近记录: |