我正在尝试使用cqlsh更新我的cassandra数据库中的现有项目:
$ > UPDATE allEvents SET "isLastEvent" = True WHERE "websiteId" = 'sd-8231'
AND "purchaser" = False
AND "currentTime" = '2016-04-06 13:06:11.534000';
我得到了这个:
InvalidRequest:code = 2200 [无效查询] message =“无法强制'2016-04-06 13:06:11.534000'到格式化日期(长)”
如果可以提供帮助:
$ > show version
[cqlsh 5.0.1 | Cassandra 3.0.2 | CQL spec 3.3.1 | Native protocol v4]
答案 0 :(得分:14)
那是因为Cassandra时间戳类型只支持毫秒。您的currentTime
精度太高了。修剪最后三个零,这应该有效:
UPDATE allEvents SET "isLastEvent" = True
WHERE "websiteId" = 'sd-8231'
AND "purchaser" = False
AND "currentTime" = '2016-04-06 13:06:11.534';
答案 1 :(得分:2)
有一个原因是"无法强迫' 2016-04-06 13:06:11.534000'到格式化的日期(长)"虽然错误,但是,timestamp列实际上存储了所有版本中的毫秒数,但基于版本的查询方式似乎存在一些差异:
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
我已验证能够使用我在9160 Thrift端口上连接的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),尽管这不应该改变。