PAYATHON 2026

能否通过 Redshift、Athena 或 Iceberg 用 SQL 更新 S3 数据?

数据小许

可以通过 SQL 更新存储在 S3 上的 Iceberg 表。更新时,引擎不会直接修改现有 Parquet/CSV 文件中的某几个字节。

截至 2026 年 11 月 4 日,Athena 和 Redshift 都支持对符合条件的 Iceberg 表执行行级更新。Redshift 已于 2026 年 4 月 23 日发布对 Iceberg 表的 UPDATE、DELETE 和 MERGE 支持,可以不依赖 Spark 或 AWS Glue 作业。Athena 更新说明、Redshift 功能公告。

SQL 更新与文件原地修改有什么区别?

S3 是对象存储。对于普通的 Parquet/CSV 对象,不能像修改数据库页面一样,通过 SQL 直接覆盖文件中的某一行。修改通常需要生成替代对象,或者由表格式记录新的数据文件和删除信息。使用相同对象键重新上传完整文件,也属于对象替换。S3 官方 FAQ。

Iceberg 在数据文件之上管理表元数据和快照,让查询引擎能够提供事务性的行级更新。常见的实现方式有:

  • copy-on-write:重写包含受影响记录的数据文件,生成新文件。
  • merge-on-read:写入删除信息和更新后的记录,在读取时合并这些变化,之后再通过文件合并整理数据。

使用支持 Iceberg 写入的 SQL 引擎时,引擎会处理底层文件写入,应用无需自行下载、编辑和重新上传文件。

Athena 的 UPDATE、DELETE 和 MERGE 使用 merge-on-read 与 positional deletes。即使表属性配置了 copy-on-write,Athena 也会忽略该配置。每次数据管理事务都会生成新快照。Athena 更新机制。

普通外部表和 Iceberg 表分别支持什么?

数据组织方式SQL 更新能力
Athena 中普通的 Parquet/CSV 外部表不能直接执行行级 UPDATE,需要改用支持更新的表格式或重建数据
Redshift Spectrum 普通外部表不支持 UPDATE
Athena 中受支持的 Iceberg 表支持 UPDATE、DELETE 和 MERGE INTO
Redshift 中符合写入条件的 Iceberg 表支持 UPDATE、DELETE 和 MERGE

Athena 的 UPDATE 仅适用于 Iceberg 表。Redshift 对普通 Spectrum 外部表的限制,不能套用到其当前的 Iceberg 写入能力上。Athena UPDATE、Redshift 普通外部表限制、Redshift Iceberg SQL。

Parquet 是文件格式,Iceberg 是表格式。已有的 Parquet 文件注册为普通外部表后,不会自动获得 Iceberg 的事务更新能力。CSV 数据通常需要先转换为目标引擎支持的数据格式,再写入 Iceberg 表。

如何使用 Athena 更新 S3 上的数据?

  1. 在 AWS Glue Data Catalog 中准备 Athena 支持的 Iceberg 表,并将已有数据导入该表。
  2. 使用 Athena engine version 3,配置所需的目录、S3 和加密密钥访问权限。
  3. 对少量条件更新使用 UPDATE;对批量增量同步使用 MERGE INTO。

假设 my_db.my_table 已经是 Iceberg 表,并且有 id、status 两列:

UPDATE my_db.my_table
SET status = 'processed'
WHERE id = 123;

如果增量数据同时包含新增记录和已有记录,可以使用:

MERGE INTO my_db.my_table AS t
USING my_db.staging_changes AS s
ON t.id = s.id
WHEN MATCHED THEN
    UPDATE SET status = s.status
WHEN NOT MATCHED THEN
    INSERT (id, status) VALUES (s.id, s.status);

这里假设暂存表也有 id、status 两列,且每个目标 id 最多匹配一条源记录。实际同步前,应根据业务键和变更顺序对增量数据去重,避免同一目标行匹配多条源记录。Athena 的 MERGE INTO 是事务性操作,仅支持 engine version 3 中的 Iceberg 表。MERGE INTO 文档。

Redshift 能否直接更新 Iceberg 表?

可以。当前 Redshift 支持直接写入注册在 AWS Glue Data Catalog 中的 Iceberg 表,覆盖 provisioned clusters 和 Redshift Serverless。Redshift Iceberg 写入说明。

假设目录访问和写入权限已经配置完成,可以执行:

UPDATE awsdatacatalog.my_db.my_table
SET status = 'processed'
WHERE id = 123;

对于由其他引擎创建的 Iceberg 表,Redshift 文档列出的写入条件包括:表格式为 Iceberg v2 或 v3,默认数据格式为 Parquet,未启用 metadata compression,也未启用 Write-Audit-Publish(WAP)。能读取一张表,并不代表它一定满足写入条件。Redshift Iceberg SQL 与限制。

AWS Glue Data Catalog 是目录服务,AWS Glue ETL 作业是计算任务。使用 Glue Data Catalog 登记表后,更新时无需每次都运行 Glue 作业。对于已有 Spark 管道、复杂转换或需要特定 Iceberg 功能的场景,Spark/Glue 更适合。

S3 数据湖应如何安排更新和维护?

对于需要持续修正、删除和增量合并的分析数据,建议使用 Iceberg 管理表,并选择满足需求的写入引擎。可以按批次收集变更,再执行 MERGE,减少大量零散更新造成的文件管理开销。

如果只有偶尔的批量修正,也可以重新生成受影响的数据集或分区。普通文件方案需要自行处理发布切换和并发读取,不能把多个 S3 对象的依次覆盖当成一次表事务。

更新投入使用后,还应安排文件维护。Athena 可使用以下命令合并数据文件和删除文件:

OPTIMIZE my_db.my_table REWRITE DATA USING BIN_PACK;

快照过期和孤立文件清理由 VACUUM 处理。应先确定历史查询与恢复所需的保留期限,再安排清理;过期快照将无法继续用于 time travel。不要绕过表格式直接删除它仍在引用的 S3 文件。Iceberg 优化说明、VACUUM 注意事项。

跨引擎使用时还要检查表格式兼容性。当前 Athena 文档限定其操作 Iceberg v2 表,因此需要由 Athena 和 Redshift 共同访问的表,应先确认兼容性,再考虑升级格式。Athena Iceberg 限制。

如果业务请求需要频繁进行单行事务更新,建议让事务数据库承接业务写入,再通过 CDC 将变更同步到 S3 数据湖。这样可以分别安排业务事务和分析数据的更新节奏。AWS CDC 与 Iceberg 示例。

备注:内容仅供参考。