我们有数百个 Glue 作业将数据从 S3 和 RDS 移动到 Redshift。当从源系统生成新数据然后移动到 Redshift 时,我们需要执行更新插入,即插入新记录并更新现有记录,以确保 Redshift 表中没有重复项。
问题是,当完成 Glue 作业(使用 Visual Studio)更新插入时,会创建一个临时表。此临时表的问题在于,对于 VARCHAR 数据类型的列,默认限制为 255。我们的数据通常包含长度大于 255 的 VARCHAR 字符列(例如描述字段)。因此,作业经常失败并出现错误:字符串长度超过 DDL 长度。
我们尝试了 Glue Visual Studio 中可用的各种转换来插入长度超过 255 的 varchar 数据。
我们的期望是将超过 255 个字符的描述字段插入到目标 Redshift 表列中。关于如何实现这一目标有什么想法吗?
我在我的计算机上复制了设置,以在测试表中执行从 S3 到 Redshift 的更新插入。
表结构:
CREATE TABLE public.test (
id integer ENCODE az64,
name character varying(256) ENCODE lzo,
salary bigint ENCODE az64,
jd character varying(300) ENCODE lzo
) DISTSTYLE AUTO;
看起来像是 Glue Visual Studio 中的一个错误,当我在“jd”列中插入超过 255 个字符时,遇到了类似的错误消息。
根本原因:- 使用 Glue Visual Studio 在 Preactions 中创建的临时表存在问题,它为字符串列创建默认 Varchar 数据类型,默认限制为 255。此外,我们无法使用 Visual ETL 控制临时表接近。
解决方案:- 当前的工作解决方案需要将可视化作业转换为脚本,因为我们没有在可视化模式下更改临时表的数据类型大小的选项。
1. Go to Job -> Navigate to Script -> Edit script
2. Update the Preaction statement's temp table create statement to change the Varchar size based on a number of characters you are expecting in Description columns as below:
"preactions": DROP TABLE IF EXISTS public.test_temp_df5c11; CREATE TABLE public.test_temp_df5c11 (id int, name VARCHAR, salary VARCHAR, jd VARCHAR(300));",
},
手动编辑 preaction 语句后,我能够插入数据。