从 s3 复制镶木地板时出现 Redshift 外部目录错误

Redshift external catalog error when copying parquet from s3

我正在尝试通过 parquet 格式将 Google 分析数据复制到 redshift 中。当我将列限制为几个 select 字段时,我可以复制数据。但是在包含几个特定的​​列时我得到一个错误:

ERROR: External Catalog Error. Detail: ----------------------------------------------- error: External Catalog Error. code: 16000 context: Unsupported column type found for column: 6. Remove the column from the projection to continue. query: 18669834 location: s3_request_builder.cpp:2070 process: padbmaster [pid=23607] -----------------------------------------------

我知道问题很可能与数据有关,但我不确定如何调试,因为这个错误无论如何都没有帮助。我尝试将列的数据类型更改为超级,但没有成功。我这里没有使用红移光谱。

我假设您的 parquet 中有半结构化数据(如数组)。

这种情况,你可以看看最底下这个页面https://docs.aws.amazon.com/redshift/latest/dg/ingest-super.html

它说:

If your semistructured or nested data is already available in either Apache Parquet or Apache ORC format, you can use the COPY command to ingest data into Amazon Redshift.

The Amazon Redshift table structure should match the number of columns and the column data types of the Parquet or ORC files. By specifying SERIALIZETOJSON in the COPY command, you can load any column type in the file that aligns with a SUPER column in the table as SUPER. This includes structure and array types.

COPY foo FROM 's3://bucket/somewhere' ... FORMAT PARQUET SERIALIZETOJSON;

对我来说,最后一行

...
FORMAT PARQUET SERIALIZETOJSON;

成功了。

我找到了解决方案。在错误消息中它说 Unsupported column type found for column: 6。 Redshift 列序数从 0 开始。我从 1 开始计算列数,而不是 0(我的错误)。所以这意味着问题出在第 6 列(我读作第 7 列),在我的例子中是 stringvarchar 列。我创建了一个仅包含此列的 table 并尝试仅在此列中上传数据。然后我得到了

redshift_connector.error.ProgrammingError: {'S': 'ERROR', 'C': 'XX000', 'M': 'Spectrum Scan Error', 'D': '\n  -----------------------------------------------\n  error:  Spectrum Scan Error\n  code:      15001\n  context:   The length of the data column display_name is longer than the length defined in the table. Table: 256, Data: 1020

为这些列重新创建具有 varchar(max) 的列解决了问题