尽管数据有效,但 Redshift 上的 COPY 总是失败并出现时间戳错误

Posted

技术标签:

【中文标题】尽管数据有效,但 Redshift 上的 COPY 总是失败并出现时间戳错误【英文标题】:COPY on Redshift always fails with timestamp error despite valid data 【发布时间】:2016-08-21 01:17:14 【问题描述】:

我有这些数据无法通过 COPY 导入我的 redshift 集群:

"piXKfqz9e54V6n799BYnKSsc2nI="|"e45a2fb9-d0a1-4ffe-bb55-5e91548fbd79"|"\\N"|"2016-08-06 12:34:49"|"2016-08-06 12:34:49"|"impression"|"e45a2fb9-d0a1-4ffe-bb55-5e91548fbd79"|"marketplace_server"|"\\N"|"\\N"|"\\N"|"\\N"|"\\N"|"\\N"|"\\N"|"\\N"|"\\N"|"\\N"|"\\N"|"\\N"|"/lead_dyno/visit_store/140409475"|"lead_dyno"|"visit_store"|"140409475"|"lead_dyno"|"\\N"|"2607:fb90:6847:e17b:1304:2a57:e797:80ed"|"\\N"|"Mozilla/5.0 (Linux; android 6.0; LGMS631 Build/MRA58K) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/51.0.2704.81 Mobile Safari/537.36"

错误是:

Invalid timestamp format or value [YYYY-MM-DD HH24:MI:SS]

有问题的字段是第 4 个具有值的字段:

"2016-08-06 12:34:49"

我已经尝试了几乎所有我能想到的尝试通过 COPY 导入的标志:

copy event from 's3://bucket/test-manifest' credentials 'aws_access_key_id=<KEY>;aws_secret_access_key=<SECRET>' removequotes gzip manifest NULL AS '\\N';

我已经尝试添加

timeformat 'auto'
timeformat 'YYYY-MM-DD HH24:MI:SS' dateformat 'YYYY-MM-DD'
timeformat 'YYYY-MM-DD HH24:MI:SS'
timeformat 'YYYY-MM-DD HH:MI:SS'

我真的想不出任何办法来获取这一行,而且我看不出这些数据有什么问题。

有什么想法吗?

【问题讨论】:

您能发布您的表格定义吗? SELECT * FROM pg_table_def WHERE tablename = '' 【参考方案1】:

我认为您的错误不是由于格式。我用你的副本声明测试了你的数据,它在我第一次尝试时就奏效了。可能是清单文件的语法、表的 DDL、文件在 S3 中的位置。

我刚刚使用您的数据进行了测试,结果运行良好。

比较我的文件和你的文件,它可能会帮助你找到问题。

这是我使用的:

我的表 DDL 在这里:

CREATE TABLE tba (
 text1 varchar(256) NULL
,text2 varchar(256) NULL
,text3 varchar(256) NULL
,date01 timestamp NULL
,date02 timestamp NULL
,text4 varchar(256) NULL
) DISTSTYLE EVEN;

这些是我的 data1.txt 文件的内容

"piXKfqz9e54V6n799BYnKSsc2nI="|"e45a2fb9-d0a1-4ffe-bb55-5e91548fbd79"|"\\N"|"2016-08-06 12:34:49"|"2016-08-06 12:34:49"|"impression"

这是我的 data1-manifest 文件


  "entries": [
    "url":"s3://<<my-bucket>>/data1.txt", "mandatory":true
  ]

这是我的复制声明(基本上是从你的复制和粘贴)

copy tba from 's3://rocha-dev/data1-manifest' credentials 
'aws_access_key_id=<<mykey>>;aws_secret_access_key=<<my-secret>>' removequotes  manifest NULL AS '\\N';

以下是从我的 PSQL 窗口复制的,显示执行成功:

dev=# CREATE TABLE tba (
dev(#  text1 varchar(256) NULL
dev(# ,text2 varchar(256) NULL
dev(# ,text3 varchar(256) NULL
dev(# ,date01 timestamp NULL
dev(# ,date02 timestamp NULL
dev(# ,text4 varchar(256) NULL
dev(# ) DISTSTYLE EVEN;
CREATE TABLE


dev=# copy tba from 's3://<<my-bucket>>/data1-manifest' credentials 'aws_access_key_id= <<my-key>>; aws_secret_access_key=<<my-secret>>' removequotes  manifest NULL AS '\\N'; 
INFO:  Load into table 'tba' completed, 1 record(s) loaded successfully.
COPY


dev=# select * from tba;
            text1             |                text2                 | text3 |       date01        |       date02        |   text4    
------------------------------+--------------------------------------+-------+---------------------+---------------------+------------
 piXKfqz9e54V6n799BYnKSsc2nI= | e45a2fb9-d0a1-4ffe-bb55-5e91548fbd79 | \\N   | 2016-08-06 12:34:49 | 2016-08-06 12:34:49 | impression
(1 row)

我的陈述和你的陈述之间的唯一实质性区别是我没有使用 gzip,因为我只有一条记录要加载。

【讨论】:

你完全正确。我仍在努力弄清楚发生了什么,但到目前为止,我发现如果我手动编辑文件以删除“\\N”并将其替换为“\N”,则副本有效。我现在用“NULL AS '\N'”重新转储,然后会看到。感谢您的帮助! 我想我在那里。我必须处理的最后一个问题是字符串长度。 UTF-8 字符串,我将它们截断为 32(模式的最大长度),但它们以 50+ 字节出现,无法通过 COPY 插入。有什么想法吗? 那应该是个新问题... PostgreSQL 字符串字段长度是以字符而不是字节来衡量的,所以应该没有问题。

以上是关于尽管数据有效,但 Redshift 上的 COPY 总是失败并出现时间戳错误的主要内容,如果未能解决你的问题,请参考以下文章

将有效负载数据从 dynamodb 复制到 redshift

Redshift DEFAULT GETDATE() 处理 INSERT 但不是 COPY

来自 S3 的 Redshift 复制命令有效,但没有上传数据

AWS Redshift 节点故障 - 尽管有多个节点,但整个集群是不是不可用?

用于复制的 Redshift ROLLBACK

对定义为排序键的列进行 Redshift 顺序扫描