RedShift Copy - 列数不匹配 - 可以在卸载中指定吗?

Posted

技术标签:

【中文标题】RedShift Copy - 列数不匹配 - 可以在卸载中指定吗?【英文标题】:RedShift Copy - Unmatched Number of Columns - Possible to specify in Unload? 【发布时间】:2020-05-12 21:25:31 【问题描述】:

在尝试从 s3 数据源创建 RedShift 表时,我遇到了错误:

[Amazon](500310) Invalid operation: Spectrum Scan Error Details: -------------------------------------- 
--------- error: Spectrum Scan Error code: 15001 context: Unmatched number of columns between table and file. 
Table columns: 137, Data columns: 136, 
File name: https://s3.aws-region.amazonaws.com/s3_bucket/s3_data/part_date=2020-01-01/0044_part_00.parquet 
query: 10191102 location: dory_util.cpp:922 process: fetchtask_thread [pid=xxxxxx]

因此,此源表是从 s3 中按日期分区的数据创建的频谱表。它是使用 UNLOAD 命令创建的,然后使用 AWS Glue 爬虫创建频谱表。爬虫显示有 137 列,但我认为并非所有镶木地板文件都表明这一点。有没有办法强制 UNLOAD 在卸载的 parquet 文件中传播所有 137 列以避免此错误?

这是我的卸载:

unload('select * from my table')
to 's3://path/to/data'
parquet
partition by (part_date)
allowoverwrite;

这就是我尝试复制的方式(选择为 + 截断只是为了确保架构):

drop table if exists db.table;
create table db.table
distkey (part_date)
sortkey (part_date, key_1, key_2)
as
select * from spectrum_table limit 1;
truncate db.table;

copy db.table
from 's3://path/to/data'
iam_role 'iam_role_details'
format as parquet;

【问题讨论】:

【参考方案1】:

select * from spectrum_table limit 1; -- 这是否与您期望从 s3 复制数据文件中获得的列数相同?您已截断数据,但结构保持不变。

如果需要在 COPY 命令中指定列,您可以使用此语法 - https://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html

COPY table-name 
[ column-list ]
FROM data_source
authorization
[ [ FORMAT ] [ AS ] data_format ] 
[ parameter [ argument ] [, ... ] ]

【讨论】:

以上是关于RedShift Copy - 列数不匹配 - 可以在卸载中指定吗?的主要内容,如果未能解决你的问题,请参考以下文章

列数不匹配

例外:尽管范围是从数据创建的,但数据中的列数与范围中的列数不匹配

异常:数据中的列数与范围内的列数不匹配

PHP ~ 列数与第 1 行的值数不匹配

PHP ~ 列数与第 1 行的值数不匹配

DB::Exception: 从 localhost:8000 接收。 DB::Exception:列数不匹配