web-dev-qa-db-ja.com

Cassandra:「2016-04-0613:06:11.534000」をフォーマットされた日付に強制変換できません(長い)

Cqlshを使用してcassandra DB内の既存のアイテムを更新しようとしています:

$ > UPDATE allEvents SET "isLastEvent" = True WHERE "websiteId" = 'sd-8231'
AND "purchaser" = False
AND "currentTime" = '2016-04-06 13:06:11.534000';

そして私はこれを手に入れました:

InvalidRequest:code = 2200 [Invalid query] message = "Unable to coerce '2016-04-06 13:06:11.534000' to a formated date(long)"

それが役立つ場合:

$ > show version
[cqlsh 5.0.1 | Cassandra 3.0.2 | CQL spec 3.3.1 | Native protocol v4]
11
farhawa

これは、Cassandraタイムスタンプタイプがミリ秒しかサポートしていないためです。currentTimeの精度が高すぎます。最後の3つのゼロを削除すると、機能するはずです。

UPDATE allEvents SET "isLastEvent" = True 
WHERE "websiteId" = 'sd-8231'
      AND "purchaser" = False 
      AND "currentTime" = '2016-04-06 13:06:11.534';
15
Aaron

「フォーマットされた日付(長い)に「2016-04-0613:06:11.534000」を強制できない」エラーには理由がありますが、タイムスタンプ列には実際にはすべてのバージョンでミリ秒が格納されますが、いくつかの違いがあるようですバージョンに基づいてクエリを実行する方法:

Cassandra <= 2.1は、クエリでミリ秒をサポートしていないようです:yyyy-mm-dd'T'HH:mm:ssZ https://docs.datastax.com/en/cql/3.1/cql/cql_reference/ timestamp_type_r.html

> = 3.0はそれをサポートします:yyyy-mm-dd'T'HH:mm:ss.ffffffZ https://docs.datastax.com/en/cql/3.3/cql/cql_reference/timestamp_type_r.html

9160Thriftポートに接続されたIDE、cqlshをまだ試していません。

INSERT INTO "sp.status"("ams", "load_start_time")
    VALUES('RRG', '2018-05-01T16:57:18.123+0200')
;

-- same with select, works on new cluster but not old
SELECT * FROM sp.status WHERE ams = 'RRG' AND load_start_time='2018-05-01T16:57:18.123+0200'
;

ただし、ドライバーはJava日付をマップし、古いクラスターと新しいクラスターの両方にミリ秒を格納できるようです。

= Cassandra 2.1 cqlshはネイティブバイナリプロトコル(9042)を使用し、以前のバージョンはthrift(9160)を使用しますが、これは変更されるべきではありません。

2
kisna