You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Athena查询S3 Inventory视图返回重复行问题排查

问题排查:all_buckets_latest_report_clean_view返回重复行的原因

1. 分区键设计错误(核心原因)

你在all_buckets_latest_report_clean_view的ROW_NUMBER()窗口函数中仅用key作为分区键:

ROW_NUMBER() OVER (PARTITION BY key ORDER BY key ASC) row_num

这种设计会导致两种错误场景:

  • 若同一bucket下存在同key的多版本记录(比如S3版本控制生成的文件版本),仅按key分区无法区分不同版本,加上排序条件ORDER BY key ASC因key相同导致排序顺序不确定,会出现本该被过滤的行未被正确标记的情况;
  • 若不同bucket存在相同key的记录,你可能期望保留所有行(分属不同存储桶),但当前逻辑会只保留其中一行,若业务误将这种情况视为“重复”,或窗口函数排序不稳定导致查询结果波动,会让你误以为存在重复行。

正确的分区逻辑应结合bucket和key,确保每个存储桶内的文件独立去重,同时建议用last_modified_date DESC排序以保留最新版本:

ROW_NUMBER() OVER (PARTITION BY bucket, key ORDER BY last_modified_date DESC) row_num

2. S3版本控制导致的隐性重复

如果你的S3存储桶开启了版本控制,S3 Inventory报告会包含同一key的多版本记录(不同version_id):

  • all_buckets_latest_report因查询所有字段(包括version_id),这些行属于不同版本,不算完全重复;
  • all_buckets_latest_report_clean_view的SELECT列表未包含version_id,导致输出行在可见字段上完全一致,视觉上呈现为重复行。

3. gen_file字段计算存在索引越界错误

子查询t中生成gen_file的语句有索引错误:

LOWER(split(key, '/')[cardinality(split(key, '/'))]) gen_file

数组索引从0开始,cardinality(split(key, '/'))返回的是数组元素个数,取该索引会导致越界,返回NULL。若多个不同key的gen_file都为NULL,且其他字段恰好匹配,会造成视觉上的重复,同时也会影响gen_type、gen_extension的计算准确性。

修正后的gen_file计算应为:

LOWER(split(key, '/')[cardinality(split(key, '/')) - 1]) gen_file

内容的提问来源于stack exchange,提问作者Naji

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 20:47:34