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]
これは、Cassandraタイムスタンプタイプがミリ秒しかサポートしていないためです。currentTime
の精度が高すぎます。最後の3つのゼロを削除すると、機能するはずです。
UPDATE allEvents SET "isLastEvent" = True
WHERE "websiteId" = 'sd-8231'
AND "purchaser" = False
AND "currentTime" = '2016-04-06 13:06:11.534';
「フォーマットされた日付(長い)に「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)を使用しますが、これは変更されるべきではありません。