Cassandra`COPY FROM`可以将GMT日期字符串强制转换为格式化日期(长)

时间:2015-03-12 17:46:19

标签: cassandra cqlsh

我一直在尝试使用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' 即可。如果我用GMT替换CSV中的所有ZCOPY 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对此帖的评论。是的,这是一个黑客但它的确有效。

1 个答案:

答案 0 :(得分:1)

我认为这里发生的事情是你的time_format文件中的~/.cassandra/cqlshrc属性。在COPY期间导出时间戳数据时,COPY 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指定自定义时间格式,并且昨天标记为“准备提交”。基本上,这个补丁将通过执行以下操作来解决此问题:

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值。