【问题标题】:Cassandra `COPY FROM`unable to coerce GMT date string to a formatted date (long)Cassandra `COPY FROM` 无法将 GMT 日期字符串强制转换为格式化日期(长)
【发布时间】:2015-05-15 00:32:05
【问题描述】:

我一直在尝试使用 COPY FROM 插入到具有 timestamp 类型列的 Cassandra 表中。但是,我遇到了以下错误:

code=2200 [Invalid query] message="unable to coerce '2015-03-06 18:11:33GMT' to a  formatted date (long)"
Aborting import at record #3. Previously-inserted values still present.
0 rows imported in 0.211 seconds.

CSV 文件的内容实际上是使用 COPY TO 命令创建的。我的TZ 环境变量已设置为GMT

我做了一些搜索,发现这里有一篇帖子提到使用Z而不是GMT作为数据字符串中的时区,即'2015-03-06 18:11:33Z'。如果我用Z 替换CSV 中的所有GMTCOPY FROM 工作。帖子链接在这里: unable to coerce '2012/11/11' to a formatted date (long)

当我在此表上运行SELECT 时,日期时间列以以下格式显示:2015-03-06 17:53:23GMT

更多信息,有一个关于“Z”时区的错误,但已修复。链接:https://issues.apache.org/jira/browse/CASSANDRA-6973

所以我的问题是,有没有一种方法可以让我运行 COPY TO 以便为时区写入 Z 而不是 GMT

或者,有没有办法让COPY FROMGMT 一起工作?

谢谢。

注意:解决方案在@Aaron 对此帖子的评论中。是的,这是一个 hack,但它可以工作。

【问题讨论】:

  • 我几乎不想告诉你这个,因为这是一个糟糕的解决方案......但如果你只是删除 % 并在 time_format 的末尾留下一个大写 Z,复制到将删除时区并在所有时间戳的末尾贴上 Z。
  • 我喜欢这样的创意!我想我会试试这个作为最后的手段!

标签: cassandra cqlsh


【解决方案1】:

我认为这里发生的事情是,您被 time_format 文件中的 time_format 属性所困扰。 COPYCOPY TO 期间导出时间戳数据时使用此设置。 CQLSH 使用Python strftime formats。有趣的是,小写的 %z 和大写的 %Z 似乎代表了您的问题。

当我SELECT 带有 %Z(上)的时间戳数据时,它看起来像这样:

aploetz@cqlsh:stackoverflow> SELECT * FROm posts1;

 userid | posttime               | postcontent  | postid
--------+------------------------+--------------+--------------------------------------
      1 | 2015-01-25 13:25:00CST |    blahblah5 | 13218139-991c-4ddc-a11a-86992f6fed66
      1 | 2015-01-25 13:22:00CST |    blahblah2 | eacdebcc-35c5-45f7-9374-d5fd987e699f
      0 | 2015-03-12 14:10:00CDT |  sdgfjdsgojr | 82766df6-4cca-4ad1-ae59-ba4488103da4
      0 | 2015-03-12 13:56:00CDT | kdsjfsdjflds | bd5c2be8-be66-41da-b9ff-98e9a4836000
      0 | 2015-03-12 09:10:00CDT |  sdgfjdsgojr | 6865216f-fc4d-431c-8067-c27cf20b6be7

当我尝试使用该日期格式INSERT 记录时,它失败了:

aploetz@cqlsh:stackoverflow> INSERT INTO posts1 (userid,posttime,postcontent,postid) VALUES (0,'2015-03-12 14:27CST','sdgfjdsgojr',uuid());
code=2200 [Invalid query] message="unable to coerce '2015-03-12 14:27CST' to a  formatted date (long)"

但是当我更改 time_format 以使用(小写)%z 时,相同的查询会产生以下结果:

aploetz@cqlsh:stackoverflow> SELECT * FROm posts1;

 userid | posttime                 | postcontent  | postid
--------+--------------------------+--------------+--------------------------------------
      1 | 2015-01-25 13:25:00-0600 |    blahblah5 | 13218139-991c-4ddc-a11a-86992f6fed66
      1 | 2015-01-25 13:22:00-0600 |    blahblah2 | eacdebcc-35c5-45f7-9374-d5fd987e699f
      0 | 2015-03-12 14:10:00-0500 |  sdgfjdsgojr | 82766df6-4cca-4ad1-ae59-ba4488103da4
      0 | 2015-03-12 13:56:00-0500 | kdsjfsdjflds | bd5c2be8-be66-41da-b9ff-98e9a4836000
      0 | 2015-03-12 09:10:00-0500 |  sdgfjdsgojr | 6865216f-fc4d-431c-8067-c27cf20b6be7

我也可以INSERT这种格式的数据:

INSERT INTO posts1 (userid,posttime,postcontent,postid) 
VALUES (0,'2015-03-12 14:27-0500','sdgfjdsgojr',uuid());

当我运行COPY TO 时,它也会以这种方式出现,并且同一数据/文件的COPY FROM 也可以。

总之,检查您的~/.cassandra/cqlshrc 并确保您使用的是默认设置或[ui] 部分中的此设置:

[ui]
time_format = %Y-%m-%d %H:%M:%S%z

它不会像您要求的那样为您提供“Z”,但它可以让您COPY TO/FROM 您的数据,而无需处理 CSV 文件。

编辑

对于那些在 Windows 上使用 CQLSH(或 Cassandra,上帝保佑你)的可怜人,cqlshrc 文件的默认位置是 c:\Users\%USERNAME%\.cassandra\cqlshrc

编辑 - 20150903

受这个问题的启发,我提交了一个补丁(CASSANDRA-8970),允许用户使用COPY 指定自定义时间格式,昨天它被标记为“Ready To Commit”。基本上,此补丁将允许通过执行以下操作来解决此问题:

COPY posts1 TO '/home/aploetz/posts1.csv' WITH DELIMITER='|' AND HEADER=true 
    AND TIME_FORMAT='%Y-%m-%d %H:%M:%SZ;

编辑 - 20161010

COPY 命令为improved in Cassandra 2.2.5TIMEFORMAT 选项已重命名为DATETIMEFORMAT

来自New options and better performance in cqlsh copy

DATETIMEFORMAT,以前叫TIMEFORMAT,一个包含Python strftime格式的日期和时间值的字符串,例如'%Y-%m-%d %H:%M:%S%z'。默认为 cqlshrc 中的 time_format 值。

【讨论】:

  • 很高兴再次见到你,布莱斯。我试过这个,把time_format放在我的cqlshrc文件中。但是,我得到的select 结果仍然有GMT 而不是-0000 附加到时间戳的末尾...不确定这是否是因为我在Windows机器上运行我的Cassandra...让我做对此进行更多研究。
  • @Will 那很奇怪。我也在我的一个 Windows 机器上进行了尝试,得到了类似的结果。我能够一起摆脱时区(只需删除%Z),但这也可能不是您想要的解决方案。
  • 谢谢布莱斯。很高兴知道这不是因为我在这里没有做错什么。
猜你喜欢
  • 2016-07-27
  • 2018-05-14
  • 2020-01-17
  • 2014-10-20
  • 2018-02-23
  • 1970-01-01
  • 2013-12-28
  • 2011-12-14
  • 2019-03-31
相关资源
最近更新 更多