未找到 Redshift COPY 命令分隔符

问题描述 投票:0回答:10

我正在尝试将一些文本文件加载到 Redshift。它们以制表符分隔,最终行值之后除外。这会导致未找到分隔符错误。我只看到一种在 COPY 语句中设置字段分隔符的方法,而不是设置行分隔符的方法。有什么想法不涉及处理我的所有文件以在每行末尾添加一个选项卡吗?

谢谢

amazon-web-services amazon-redshift
10个回答
63
投票

我认为问题不在于行尾缺少

<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

获取完整的错误报告。它将显示有错误的文件名、不正确的行号和错误详细信息。

这将有助于找到问题所在。


51
投票

如果您的行的列数少于预期,您可能会收到“未找到定界符”错误。如果最后一列为空,某些 CSV 生成器可能只会在末尾输出单引号。

要解决此问题,您可以在 Redshift 复制选项上使用 FILLRECORD。


5
投票

根据我的理解,错误消息

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';

并且我在查看系统表时收到了

Delimiter not found
错误消息
stl_load_errors
。但指定我正在以这种方式处理表达式中的 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;

解决了我的问题,我能够正确加载数据。


2
投票

我知道这个问题已经得到解答,但我刚刚处理了同样的错误,并且我有一个简单的解决方案,所以我会分享它。

也可以通过说明从 s3 文件复制的表的特定列来解决此错误(如果您知道 s3 上的数据中的列是什么)。 就我而言,数据的列数少于表中的列数。 Madahava 使用“FILLRECORD”选项的答案确实为我解决了这个问题,但后来我注意到一个应该填充默认值的列仍然为空。

COPY <table> (col1, col2, col3) from 's3://somebucket/file' ...

1
投票

这可能与OP的问题没有直接关系,但我收到了相同的

Delimiter not found
错误,这是由其中一个字段中的换行符引起的。

对于您认为可能包含换行符的任何字段,您可以使用以下方法删除它们:

replace(my_field, chr(10), '')

1
投票

有时当您未指定文件类型时会弹出此信息,例如 CSV

参考:https://docs.aws.amazon.com/redshift/latest/dg/tutorial-loading-run-copy.html

copy "dev"."my"."table" from 's3://bucket/myfile_upload.csv' credentials 'aws_iam_role=arn:aws:iam::2112277888:role/RedshiftAccessRole' IGNOREHEADER 1 csv;


0
投票

当您在 destin 表上发送的字段少于预期时,也会抛出此错误。


0
投票

我确信有多种情况会返回此错误。当我调试别人的代码时,我刚刚遇到了其他答案中没有提到的一个问题。 COPY 列出了 EXPLICIT_IDS 选项,它尝试导入的表有一个数据类型为 Identity(1,1) 的列,但它尝试导入 Redshift 的文件没有 ID 字段。将身份字段添加到文件中对我来说是有意义的。但是,我想删除 EXPLICIT_IDS 选项也可以解决该问题。


0
投票

最近我在使用复制命令加载数据时在 Redshift SQL 中遇到了 Delimiter not find 错误。就我而言,问题出在列号上。 我创建了一个包含 20 列的表,但我正在加载包含 21 列的文件。 我在表中更正了它,在表中添加了 21 列,然后重新加载数据,结果成功了。

希望对遇到同样问题的人有所帮助。 达达


0
投票

我正在从 Redshift => S3 => Redshift 复制数据,当我的数据包含空值并且我正在使用

DELIMITER AS ','
时,我遇到了这个问题。

我通过设置

NULL AS 'NULL'
(并使用默认的管道分隔符)解决了这个问题。

这些是我使用的

UNLOAD
COPY
命令:

UNLOAD ('SELECT * FROM my_table')
TO 's3://my-bucket'
IAM_ROLE 'arn:aws:iam::123:role/MyRole'
NULL AS 'NULL'
ADDQUOTES
ESCAPE
ALLOWOVERWRITE;
COPY my_new_table
FROM 's3://my-bucket'
IAM_ROLE 'arn:aws:iam::123:role/MyRole'
NULL AS 'NULL'
REMOVEQUOTES
ESCAPE;
© www.soinside.com 2019 - 2024. All rights reserved.