我在 Amazon Athena 上使用 Apache Iceberg 表时遇到错误。
解决方法
按照您遇到的错误的故障排除步骤进行操作。
不支持的表属性键
当 CREATE TABLE 或 ALTER TABLE 语句的 TBLPROPERTIES 子句不使用支持的表属性时,就会出现此错误。当您创建或修改 Iceberg 表时,Athena 只允许在表属性中包含预定义的键值对列表。
要解决此问题,请确保您的 Iceberg 表使用支持的表属性。
Athena 无法生成 CREATE TABLE 语句,因为该表具有不支持的属性
如果由于您在查询中使用了 SHOW CREATE TABLE DDL 语句而导致 Athena 无法重现表结构,则会出现“UNSUPPORTED”错误。请使用 DESCRIBE FORMATTED DDL 语句显示表属性。
收到“TABLE_REDIRECTION_ERROR”错误
此错误发生在使用不受支持的 Iceberg 表元数据的 Athena SELECT 查询中。确保您的 Athena SELECT 查询包含支持的查询 Iceberg 表元数据。
收到“Unsupported Hive type”错误
在 Iceberg 表中使用不支持的数据类型时会出现此错误。例如,您可能会收到“SHORT, use integer”错误,因为 Iceberg 表不支持 tinyint 或 smallint Athena 数据类型。或者,您可能会收到“CHAR, use string”错误,因为 Iceberg 表不支持 char Athena 数据类型。
要解决此问题,请确认您的 Athena 查询使用的是 Iceberg 表支持的数据类型。
收到“ICEBERG_COMMIT_ERROR”错误
当多个语句尝试修改为 Iceberg 表更新而并行运行的同一组文件时,可能会出现此错误。例如,当多个 DELETE 语句并行尝试同时删除同一组记录时。
要避免此问题,请执行以下操作:
- 确保查询更新按顺序运行,以避免并行数据处理。
- 在更新 Iceberg 表时实施指数回退的重试机制。
**注意:**Athena 仅支持 AWS Glue 乐观锁。当您使用其他锁定方法修改 Iceberg 表时,可能会导致数据丢失并中断交易。有关详细信息,请参阅 Apache Iceberg 网站上的 Optimistic locking。
收到“NOT_SUPPORTED: Iceberg table updates require at least format version 2”错误
当您尝试对版本 1 Iceberg 表执行 DELETE 操作时,将会出现此错误。Athena 仅创建并操作版本 2 Iceberg 表。确保您的 Iceberg 表使用的是 Athena 引擎版本 2。如果您使用其他类型的引擎,请确保将 format-version 表属性设置为 2 以允许行级别删除。例如,在编写 Iceberg 表并将其注册到 AWS Glue Data Catalog 时,使用版本 2。有关详细信息,请参阅 Apache Iceberg 网站上的 Delete formats。
收到“GENERIC_INTERNAL_ERROR:”错误
您会收到以下错误消息:
“GENERIC_INTERNAL_ERROR: com.amazonaws.trino.exceptions.UnrecoverableS3OperationException: com.amazonaws.services.s3.model.AmazonS3Exception: The specified key does not exist”
当您删除元数据文件(例如清单列表或 metadata.json)时,将会发生此错误。然后,Athena 查询失败。如果您无法成功恢复文件,请将表回滚到快照或时间戳。
**注意:**您必须在 Apache Spark 环境(如 AWS Glue 或 Amazon EMR)中回滚表,而不是 Athena 查询编辑器。
要将表回滚到特定的快照 ID,请运行 roll_to_snapshot Apache Iceberg 命令:
CALL catalog_name.system.rollback_to_snapshot('your-db.your-table', your-snapshot-id)
**注意:**将 your-db、your-table 和 your-snapshot-id 替换为您的值。
要将表回滚到特定的时间戳,请运行 rollback_to_timestamp Apache Iceberg 命令:
CALL catalog_name.system.rollback_to_timestamp('your-db.your-table', TIMESTAMP 'yyyy-mm-dd hh:mm:ss')
**注意:**将 your-db、your-table 和 yyyy-mm-dd hh:mm:ss 替换为您的值。
有关详细信息,请参阅 Apace Iceberg 网站上的 rollback_to_snapshot 和 rollback_to_timestamp。
相关信息
对 Athena 中的问题进行故障排除
如何在 Spark 中将 Apache Iceberg 与跨账户 AWS Glue Data Catalog 配合使用?
查询 Apache Iceberg 表