将 S3 复制到 Redshift:字符串长度超过 DDL 长度

Posted

技术标签:

【中文标题】将 S3 复制到 Redshift:字符串长度超过 DDL 长度【英文标题】:Copy S3 to Redshift: String length exceeds DDL length 【发布时间】:2020-11-19 18:02:00 【问题描述】:

我已手动检查文件以确保没有超出长度。这一切都很好,但我还是把每个 varchar 的长度加倍了。

我添加了 TRUNCATECOLUMNS 参数:

TRUNCATECOLUMNS

将列中的数据截断为适当的字符数,使其符合列规范。仅适用于具有 VARCHAR 或 CHAR 数据类型的列,以及大小不超过 4 MB 的行。

仍然出现此错误:Copy s3 to redshift: String length exceeds DDL length

COPY [table name] 
FROM [s3 path]
iam_role [iam role]
FORMAT CSV
IGNOREHEADER 1
region 'us-west-2'
BLANKSASNULL 
TRIMBLANKS
TRUNCATECOLUMNS

【问题讨论】:

如果字符串包含多字节字符,则需要比实际字符数更多的存储空间。您是否尝试将字段更改为 TEXT 而不是特定的 VARCHAR[n] 长度? Redshift(作为 Postgres)可以很好地处理 TEXT 正如约翰所说,您应该检查输入中的多字节(非 ascii)字符。检查您的行大小是否不超过 4MB,因为这会否定 TRUNCATECOLUMNS 选项。从 stl_load_errors 发布该行可能会提供更多信息,因为这通常会提供有关导致问题的确切字段的更多信息 - 有时问题不是您认为的问题。 哦,我认为 TEXT 类型不会对您有所帮助,因为它是 Redshift 中 VARCHAR(256) 的别名。所以除非你的尺寸小于这个...docs.aws.amazon.com/redshift/latest/dg/… 只是一个注释,但是......问题是它自己的答案:只需 添加 TRUNCATECOLUMNS 【参考方案1】:

事实证明这不是真正的问题。此错误涵盖了许多其他内容,包括日期列中的文本和数字列中的字符串..这是实际问题。

【讨论】:

以上是关于将 S3 复制到 Redshift:字符串长度超过 DDL 长度的主要内容,如果未能解决你的问题,请参考以下文章

字符长度超过 DDL 长度

在将数据从 S3 复制到 redshift 时,我遇到了以下错误:

Node-Redshift 是不是支持复制命令(查询)将数据从 S3 加载到 Redshift?

将文件(带有特定后缀)从 S3 复制到 Redshift

将 txt 文件复制到 Redshift

将数据从本地复制到 S3 到 Redshift 表时出现问题