如果未提供列列表,Redshift COPY 命令将忽略表默认值

Posted

技术标签:

【中文标题】如果未提供列列表,Redshift COPY 命令将忽略表默认值【英文标题】:Redshift COPY command ignores table default values if column list not provided 【发布时间】:2021-05-06 00:11:32 【问题描述】:

我有一个表,myTable,其中有一些带有默认值的列。

我有一个 json 文件,jsonfile.json,其中包含该表的数据,该表中的每个字段都没有值。

当我尝试执行这样的复制时:

COPY myTable
from 's3://bucket/jsonfile.json' 
IAM_ROLE 'arn:aws:iam::111111111111:role/redshift-role'
FORMAT AS JSON 'auto'
GZIP

文件中缺少的字段应该让表在复制时设置其默认值,但这些值被设置为 null 或空。

如果我改为执行这样的复制:

COPY myTable(a, b, c)  --doesn't even have to have the full column list
from 's3://bucket/jsonfile.json' 
IAM_ROLE 'arn:aws:iam::111111111111:role/redshift-role'
FORMAT AS JSON 'auto'
GZIP

然后表中具有默认值的列将被设置为默认值。

我四处寻找,没有发现任何描述这种情况的东西,或者至少我理解的是这种情况。

有人看过这个吗?

【问题讨论】:

【参考方案1】:

您应该发布一些示例数据以使事情更清楚。重要的是要记住对于空字符串和 NULL 不同的文本。空字符串是一个没有 NULL 的值,并且只有在没有为该列指定值时才分配默认值。那么在您的数据中,源文件中没有数据的字段是空字符串吗?我希望如此,但显示示例数据会澄清。有一个复制 JSON 文件的选项,它将空字符串映射到 NULL - “EMPTYASNULL”。如果我的假设是正确的,这可以解决您的问题。

【讨论】:

以上是关于如果未提供列列表,Redshift COPY 命令将忽略表默认值的主要内容,如果未能解决你的问题,请参考以下文章

Redshift COPY 命令中的投射日期列

如果我使用 COPY 命令将数据从 S3 加载到 Redshift,它会遵循我的 dist 样式和键吗?

Redshift COPY 抛出错误,但“stl_load_errors”系统表未提供详细信息

Redshift COPY 从带有 JSON 字段的 CSV 文件到 SUPER 列

Redshift 复制命令错误“溢出,列类型:整数”

如果 S3 前缀不存在,Redshift COPY 命令会引发错误