我正在尝试将一些文本文件加载到Redshift。除最终行值之外,它们以制表符分隔。这导致分隔符未找到错误。我只看到一种在COPY语句中设置字段分隔符的方法,而不是设置行分隔符的方法。任何不涉及处理我的所有文件的想法都会在每行的末尾添加一个标签?
由于
答案 0 :(得分:42)
我认为问题不在于行尾的<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
获取完整的错误报告。它将显示带有错误的文件名,错误的行号和错误详细信息。
这将有助于找出问题所在。
答案 1 :(得分:37)
如果您的行的列少于预期,则可以获取分隔符未找到错误。如果最后一列为空,则某些CSV生成器可能只在末尾输出单引号。
要解决此问题,您可以在Redshift复制选项上使用FILLRECORD。
答案 2 :(得分:1)
我知道已经回答了,但是我只是处理了同样的错误,并且我有一个简单的解决方案,所以我将与大家分享。
也可以通过声明从s3文件复制的表的特定列来解决此错误(如果您知道s3数据中的列是什么)。 在我的情况下,数据的列数少于表中的列数。 Madahava对DID选项“ FILLRECORD”的回答为我解决了这个问题,但是随后我注意到应该填充默认值的列仍然为空。
COPY <table> (col1, col2, col3) from 's3://somebucket/file' ...
答案 3 :(得分:1)
这可能与OP的问题没有直接关系,但是我收到了相同的Delimiter not found
错误,该错误是由其中一个字段中的换行符引起的。
对于您认为可能包含换行符的任何字段,可以使用以下命令将其删除:
replace(my_field, chr(10), '')
答案 4 :(得分:1)
据我了解,错误消息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
错误消息。但是用这种方式表示:
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;
解决了我的问题,我能够正确加载数据。
答案 5 :(得分:0)
当您发送的字段少于目的地表上的预期数量时,它也会引发此错误。
答案 6 :(得分:0)
我确定有多种情况会返回此错误。我在调试别人的代码时碰到了一个在其他答案中没有提到的东西。 COPY列出了EXPLICIT_IDS选项,它试图导入的表中有一列的数据类型为identity(1,1),但是它试图导入到Redshift的文件中没有ID字段。对我来说,将标识字段添加到文件中很有意义。但是,我想删除EXPLICIT_IDS选项也可以解决此问题。