提问人:Rajarshi Mukherjee 提问时间:11/13/2023 更新时间:11/13/2023 访问量:32
ICEBERG_FILESYSTEM_ERROR:无法在非空位置创建表
ICEBERG_FILESYSTEM_ERROR: Cannot create a table on a non-empty location
问:
我的要求是每周删除并重新创建一个 ICEBERG 表(环境 AWS Athena 和存储作为 S3)
所以我在以下 2 个 SQL 作为脚本运行。
DROP TABLE my_table;
CREATE TABLE my_table WITH (
is_external = false,
location = 's3://my_bucket/my_table',
table_type='iceberg',
vacuum_max_snapshot_age_seconds=3600
write_compression='ZSTD',
format='PARQUET'
)
AS
SELECT * from my_backup_table;
现在的挑战是,如果表变得非常大并积累了许多小文件,则 DROP SQL 命令永远不会完全清理 S3 位置。因此,CREATE TABLE脚本失败,并显示
ICEBERG_FILESYSTEM_ERROR:无法在非空位置 s3://my_bucket/my_table 上创建表。在重试之前,您可能需要手动清理位置“s3://my_bucket/Athena_Results/tables/13654f64-6fcb-4879-9e45-bc510be429ae”中的数据。Athena 不会删除您账户中的数据。
现在我重新创建表(在手动清理 S3 位置后)并发现新表中的对象数量急剧减少,然后 DROP/CTAS 脚本工作正常,DROP 清理整个 S3 位置。但几天后,对象数量将增加。
任何帮助将不胜感激。
答:
1赞
nicor88
11/13/2023
#1
该问题是由于以下事实:冰山在引擎盖下超时,并且如果您积累了太多的 s3 对象,则底层 s3 位置会变脏。
对于重新创建的表,您不会注意到这种行为,因为 s3 对象并不多。DROP
几个选项:
- 不要使用 drop,而是使用 Glue api 和 s3 删除对象。例如,选择表的 s3 位置,通过 glue delete table api 删除表,最后删除 s3 位置
- 您可以考虑使用 dbt,特别是 dbt-athena https://github.com/dbt-athena/dbt-athena,其中您有更多的实用程序,并且上面描述的第一个选项是处理冰山表的本机方法
评论