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
相关产品推荐
相关产品推荐

