如果未提供列列表,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 命令将忽略表默认值的主要内容,如果未能解决你的问题,请参考以下文章
如果我使用 COPY 命令将数据从 S3 加载到 Redshift,它会遵循我的 dist 样式和键吗?
Redshift COPY 抛出错误,但“stl_load_errors”系统表未提供详细信息