Amazon Redshift
数据库开发人员指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

对 Amazon Redshift Spectrum 中的查询进行故障排除

在下面,您可以找到用于识别和处理在使用 Amazon Redshift Spectrum 查询时可能遇到的一些最常见和最严重的问题的快速参考。要查看 Redshift Spectrum 查询生成的错误,请查询 SVL_S3LOG 系统表。

超过了重试次数

如果 Amazon Redshift Spectrum 请求超时,将取消并重新提交请求。在 5 次重试失败之后,查询将失败并返回以下错误。

error: S3Query Exception (Fetch), retries exceeded

可能的原因包括:

  • 文件大小过大 (大于 1 GB)。检查您在 Amazon S3 中的文件大小并查找大文件和文件大小偏斜。将大文件分成若干个大小在 100 MB 和 1 GB 之间的小文件。尝试使文件的大小大致相同。

  • 网络吞吐量低。稍后尝试您的查询。

未返回已分区表的行

如果您的查询未返回已分区外部表中的任何行,请检查是否已为此外部表添加分区。Redshift Spectrum 仅扫描位于已使用 ALTER TABLE … ADD PARTITION 显式添加的 Amazon S3 位置的文件。查询 SVV_EXTERNAL_PARTITIONS 视图以查找现有分区。对每个缺失分区运行 ALTER TABLE ADD … PARTITION。

未授权错误

验证集群的 IAM 角色是否允许访问 Amazon S3 文件对象。如果您的外部数据库在 Amazon Athena 上,请验证 AWS Identity and Access Management (IAM) 角色是否允许访问 Athena 资源。有关更多信息,请参阅 Amazon Redshift Spectrum 的 IAM 策略

数据格式不兼容

对于列式文件格式 (如 Parquet),列类型嵌有数据。CREATE EXTERNAL TABLE 定义中的列类型必须与数据文件的列类型匹配。如果存在不匹配的情况,您会收到类似以下内容的错误:

Copy
Task failed due to an internal error. File 'https://s3bucket/location/file has an incompatible Parquet schema for column ‘s3://s3bucket/location.col1'. Column type: VARCHAR, Par

由于消息长度存在限制,错误消息可能会被截断。要检索完整的错误消息 (包括列名和列类型),请查询 SVL_S3LOG 系统视图。

以下示例查询上次执行的查询的 SVL_S3LOG。

Copy
select message from svl_s3log where query = pg_last_query_id() order by query,segment,slice;

以下是显示完整错误消息的结果的示例。

 message –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––- S3 Query Exception (Fetch). Task failed due to an internal error. File 'https://s3bucket/location/file has an incompatible Parquet schema for column ' s3bucket/location.col1'. Column type: VARCHAR, Parquet schema:\noptional int64 l_orderkey [i:0 d:1 r:0]\n

要更正该错误,请将外部表修改为与 Parquet 文件的列类型匹配。

在 Amazon Redshift 中使用 Hive DDL 时遇到语法错误

对于 CREATE EXTERNAL TABLE,Amazon Redshift 支持与 Hive DDL 类似的数据定义语言 (DDL)。但是,这两种类型的 DDL 并不总是完全相同。如果您复制 Hive DDL 以创建或修改 Amazon Redshift 外部表,则可能遇到语法错误。下面是 Amazon Redshift 和 Hive DDL 之间的差别的示例:

  • Amazon Redshift 需要单引号 ('),而 Hive DDL 支持双引号 (")。

  • Amazon Redshift 不支持 STRING 数据类型。请改用 VARCHAR。