AWS Athena关联两张表查询超时,除调整超时阈值外的解决方法咨询
Athena关联建表超时优化方案
1. 优化现有查询逻辑,降低计算开销
- 移除冗余过滤逻辑:如果
partition_0已经是按天设置的分区字段,你现有的substring(datetimestamp, 1, 10) = '2021-10-24'过滤条件完全冗余,会对每一行数据做字符串切割计算,直接删除即可大幅减少计算量。 - 简化关联逻辑:提前确认关联键
col1的数据类型是否一致,避免隐式类型转换拖慢关联速度;如果右表tab2的col1存在大量重复值,先在子查询中用DISTINCT或者GROUP BY去重,减少关联时的无效计算。 - 明确输出字段:不要用
SELECT *返回所有字段,显式指定需要的字段并对重名字段设置别名,避免写入重复字段带来的额外开销。优化后的参考语句如下:
CREATE TABLE IF NOT EXISTS TestTab1 AS SELECT a.col1, a.col2 AS a_col2, a.col3 AS a_col3, a.col4 AS a_col4, b.col2 AS b_col2, b.col3 AS b_col3, b.col4 AS b_col4 FROM "TestDB"."tab1" a LEFT OUTER JOIN "TestDB"."tab2" b ON a.col1 = b.col1 AND b.partition_0 = '10-24-2021' WHERE a.partition_0 = '10-24-2021'
2. 优化引擎与表存储配置
- 升级Athena引擎版本:如果当前使用的是Athena V1引擎,切换为V2或V3版本,新版本引擎对Join、扫描类操作的性能提升可达数倍,默认算力支持也更高。
- 切换为列式存储格式:如果源表底层是CSV、JSON这类文本存储格式,先用CTAS语句转换成Parquet或ORC列式存储并开启Snappy压缩,相同数据量下扫描速度可提升3~10倍,存储体积也会大幅缩小。转换语句参考:
CREATE TABLE TestDB.tab1_parquet WITH ( format = 'PARQUET', parquet_compression = 'SNAPPY', partitioned_by = ARRAY['partition_0'] ) AS SELECT * FROM TestDB.tab1
- 合并小文件:如果源表对应的S3路径下存在大量小于1MB的小文件,可通过Glue Compaction任务或者Athena V3引擎支持的
OPTIMIZE命令合并小文件,减少文件扫描的调度开销。
3. 拆分查询或改用其他AWS服务
- 拆分执行逻辑:将过滤、关联、写入步骤拆分,先把两张表过滤后的结果分别写入临时表,再对容量更小的临时表做关联建表,降低单次查询的复杂度。
- 改用Glue ETL任务:提交Glue Spark ETL任务执行关联逻辑,Glue任务默认超时阈值远高于Athena的30分钟,5GB数据的关联仅需2~4个DPU即可在数分钟内跑完,结果写入S3后用Glue Crawler爬取即可生成目标表。
- 用EMR Serverless运行作业:如果是一次性任务,可提交简单的Spark SQL作业到EMR Serverless执行,资源可按需弹性配置,无需维护集群。
内容的提问来源于stack exchange,提问作者PPSATO
相关产品推荐
相关产品推荐

