【发布时间】:2014-03-18 17:38:36
【问题描述】:
我正在尝试将一些文本文件加载到 Redshift。它们是制表符分隔的,除了在最后一行值之后。这导致未找到分隔符错误。我只看到在 COPY 语句中设置字段分隔符的方法,而不是设置行分隔符的方法。任何不涉及处理我的所有文件以在每行末尾添加选项卡的想法?
谢谢
【问题讨论】:
标签: amazon-web-services amazon-redshift
我正在尝试将一些文本文件加载到 Redshift。它们是制表符分隔的,除了在最后一行值之后。这导致未找到分隔符错误。我只看到在 COPY 语句中设置字段分隔符的方法,而不是设置行分隔符的方法。任何不涉及处理我的所有文件以在每行末尾添加选项卡的想法?
谢谢
【问题讨论】:
标签: amazon-web-services amazon-redshift
我认为问题不在于行尾缺少<tab>。您确定所有行都有正确的字段数吗?
运行查询:
select le.starttime, d.query, d.line_number, d.colname, d.value,
le.raw_line, le.err_reason
from stl_loaderror_detail d, stl_load_errors le
where d.query = le.query
order by le.starttime desc
limit 100
获取完整的错误报告。它将显示带有错误、错误行号和错误详细信息的文件名。
这将有助于找出问题所在。
【讨论】:
如果您的行的列数少于预期,您可能会收到未找到分隔符的错误。如果最后一列为空,某些 CSV 生成器可能只在末尾输出一个单引号。
要解决此问题,您可以在 Redshift 复制选项上使用 FILLRECORD。
【讨论】:
据我了解,错误消息Delimiter not found 也可能是由于未正确指定COPY 命令引起的,特别是未指定数据格式参数https://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html
在我的例子中,我试图用这个表达式加载 Parquet 数据:
COPY my_schema.my_table
FROM 's3://my_bucket/my/folder/'
IAM_ROLE 'arn:aws:iam::my_role:role/my_redshift_role'
REGION 'my-region-1';
我在查看系统表stl_load_errors 时收到了Delimiter not found 错误消息。但是指定我正在以这种方式处理表达式中的 Parquet 数据:
COPY my_schema.my_table
FROM 's3://my_bucket/my/folder/'
IAM_ROLE 'arn:aws:iam::my_role:role/my_redshift_role'
FORMAT AS PARQUET;
解决了我的问题,我能够正确加载数据。
【讨论】:
我知道这已得到解答,但我刚刚处理了同样的错误,并且我有一个简单的解决方案,所以我会分享它。
也可以通过说明从 s3 文件复制的表的特定列来解决此错误(如果您知道 s3 上的数据中的列是什么)。 在我的情况下,数据的列数少于表中的列数。 Madahava 对“FILLRECORD”选项的回答确实为我解决了这个问题,但后来我注意到应该用默认值填充的列仍然为空。
COPY <table> (col1, col2, col3) from 's3://somebucket/file' ...
【讨论】:
这可能与 OP 的问题没有直接关系,但我收到了相同的 Delimiter not found 错误,这是由其中一个字段中的换行符引起的。
对于您认为可能包含换行符的任何字段,您可以使用以下命令将其删除:
replace(my_field, chr(10), '')
【讨论】:
当你在destin表上发送的字段少于预期时,它也会抛出这个错误。
【讨论】:
我确信有多种情况会返回此错误。我只是在调试别人的代码时遇到了一个在其他答案中没有提到的问题。 COPY 列出了 EXPLICIT_IDS 选项,它试图导入的表有一个数据类型为 identity(1,1) 的列,但它试图导入 Redshift 的文件没有 ID 字段。将身份字段添加到文件中对我来说是有意义的。但是,我想删除 EXPLICIT_IDS 选项也可以解决问题。
【讨论】: