我认为这里发生的事情是,您被 time_format 文件中的 time_format 属性所困扰。 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 指定自定义时间格式,昨天它被标记为“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,以前叫TIMEFORMAT,一个包含Python strftime格式的日期和时间值的字符串,例如'%Y-%m-%d %H:%M:%S%z'。默认为 cqlshrc 中的 time_format 值。