Cassandra`COPY FROM`无法将 GMT 日期字符串强制转换为格式化日期(长)
Cassandra `COPY FROM`unable to coerce GMT date string to a formatted date (long)
我一直在尝试使用 COPY FROM
插入具有 timestamp
类型列的 Cassandra table。但是,我遇到了以下错误:
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
。
我做了一些搜索,发现 post 这里提到使用 Z
而不是 GMT
作为数据字符串中的时区,即 '2015- 03-0618:11:33Z'。如果我用 Z
替换我的 CSV 中的所有 GMT
,COPY FROM
就可以了。 Link 代表 post 在这里:
unable to coerce '2012/11/11' to a formatted date (long)
当我在这个 table 上 运行 a SELECT
时,日期时间列显示的格式为:2015-03-06 17:53:23GMT.
更多信息,有一个关于 'Z' 时区的错误,但已修复。 Link: https://issues.apache.org/jira/browse/CASSANDRA-6973
所以我的问题是,有没有一种方法可以让我 运行 COPY TO
写 Z
而不是 GMT
作为时区?
或者,有没有办法让 COPY FROM
与 GMT
一起工作?
谢谢。
注意:解决方案在@Aaron 对此 post 的评论中。是的,这是一个技巧,但它确实有效。
我认为这里发生的事情是,您被 ~/.cassandra/cqlshrc
文件中的 time_format
属性 咬住了。 COPY
在 COPY TO
期间导出时间戳数据时使用此设置。 CQLSH 使用 Python strftime formats。有趣的是,小写的 %z 和大写的 %Z 似乎代表了您的问题。
当我 SELECT
带有 %Z(上)的时间戳数据时,它看起来像这样:
aploetz@cqlsh:Whosebug> 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:Whosebug> 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:Whosebug> 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
的时候也是这样出现的,同一个data/file的一个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.5,TIMEFORMAT
选项已重命名为 DATETIMEFORMAT
。
来自 New options and better performance in cqlsh copy:
DATETIMEFORMAT, which used to be called TIMEFORMAT, a string containing the Python strftime format for date and time values, such as ‘%Y-%m-%d %H:%M:%S%z’. It defaults to the time_format value in cqlshrc.
我一直在尝试使用 COPY FROM
插入具有 timestamp
类型列的 Cassandra table。但是,我遇到了以下错误:
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
。
我做了一些搜索,发现 post 这里提到使用 Z
而不是 GMT
作为数据字符串中的时区,即 '2015- 03-0618:11:33Z'。如果我用 Z
替换我的 CSV 中的所有 GMT
,COPY FROM
就可以了。 Link 代表 post 在这里:
unable to coerce '2012/11/11' to a formatted date (long)
当我在这个 table 上 运行 a SELECT
时,日期时间列显示的格式为:2015-03-06 17:53:23GMT.
更多信息,有一个关于 'Z' 时区的错误,但已修复。 Link: https://issues.apache.org/jira/browse/CASSANDRA-6973
所以我的问题是,有没有一种方法可以让我 运行 COPY TO
写 Z
而不是 GMT
作为时区?
或者,有没有办法让 COPY FROM
与 GMT
一起工作?
谢谢。
注意:解决方案在@Aaron 对此 post 的评论中。是的,这是一个技巧,但它确实有效。
我认为这里发生的事情是,您被 ~/.cassandra/cqlshrc
文件中的 time_format
属性 咬住了。 COPY
在 COPY TO
期间导出时间戳数据时使用此设置。 CQLSH 使用 Python strftime formats。有趣的是,小写的 %z 和大写的 %Z 似乎代表了您的问题。
当我 SELECT
带有 %Z(上)的时间戳数据时,它看起来像这样:
aploetz@cqlsh:Whosebug> 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:Whosebug> 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:Whosebug> 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
的时候也是这样出现的,同一个data/file的一个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.5,TIMEFORMAT
选项已重命名为 DATETIMEFORMAT
。
来自 New options and better performance in cqlsh copy:
DATETIMEFORMAT, which used to be called TIMEFORMAT, a string containing the Python strftime format for date and time values, such as ‘%Y-%m-%d %H:%M:%S%z’. It defaults to the time_format value in cqlshrc.