【问题标题】:Cassandra: Unable to coerce '2016-04-06 13:06:11.534000' to a formatted date (long)Cassandra:无法将“2016-04-06 13:06:11.534000”强制转换为格式化日期(长)
【发布时间】:2016-07-27 00:34:25
【问题描述】:

我正在尝试使用 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 [Invalid query] message="Unable to coerce '2016-04-06 13:06:11.534000' to a formatted date (long)"

如果有帮助的话:

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

【问题讨论】:

  • 您需要额外的精度吗? Cassandra 的时间戳类型仅支持毫秒。如果您需要更高的精度,您可以使用精确到 100 纳秒间隔的 timeuuid 类型 (UUIDv1)。

标签: cassandra cql cqlsh


【解决方案1】:

这是因为 Cassandra 时间戳类型仅支持毫秒。您的 currentTime 精度过高。剪掉最后三个零,这应该可以工作:

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

【讨论】:

  • 感谢您的回复,但为什么我插入时这并不重要?
  • @farhawa 我猜你用来向 Cassandra 插入数据的任何客户端都是以不同的方式处理插入而不是更新,并默默地删除额外的精度。
【解决方案2】:

“无法将'2016-04-06 13:06:11.534000'强制转换为格式化日期(长)”错误是有原因的,尽管时间戳列实际上在所有版本中都存储毫秒,但似乎根据版本查询方式会有一些差异:

Cassandra 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),尽管这不应该改变。

【讨论】:

    猜你喜欢
    • 2018-05-19
    • 2016-12-07
    • 1970-01-01
    • 2016-09-05
    • 2015-05-15
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    • 2020-01-17
    相关资源
    最近更新 更多