Cassandra cqlsh - 如何显示timestamp列的微秒/毫秒?

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

为了回答你的问题,我对这个问题进行了一些挖掘.

  1. Cassandra是否使用时间戳数据类型捕获微秒?

微秒不,毫秒是.如果我创建表,插入一行,并尝试通过截断时间查询它,它不起作用:

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)

但是当我在指定毫秒时查询相同的值idtype值时:

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),但它被解决为"无法修复".

  1. 我怎样才能看到用cqlsh来验证?

实际验证毫秒确实存在的一种可能方法是将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)


Tom*_*Tom 7

您可以使用python的'strftime'语法配置.cassandra/cqlshrc文件中datetime对象的输出格式.

不幸的是,%f微秒的指令(似乎没有毫秒的指令)对旧的python版本不起作用,这意味着你必须回到blobAsBigint(timestampAsBlob(date))解决方案.