AWS Athena分区更新:ALTER TABLE与Glue Crawler成本及优劣对比
问题背景与咨询
我正在执行将多个小型JSON文件合并为大型JSON文件的流程,当前通过以下Athena代码实现:
query = "CREATE TABLE {0} WITH ( external_location='{1}', write_compression = 'NONE', format = 'JSON') AS SELECT * FROM standardtable WHERE partition_0 = '{0}'".format(dataset_name,outputjson) client = boto3.client('athena') # Create a Athena table with the dataset name, and create a Json from the newly created Athena table. # Athena is crawling the hylandlm_dataset S3 bucket and creating a row for each json file within the bucket. # PartionID is the subfolder name(dataset name). Creating a table based on that partionID. Creating a JSON from the table try: response = client.start_query_execution( QueryString=query, QueryExecutionContext={ 'Database': DATABASE }, ResultConfiguration={ 'OutputLocation': output, } )
当S3存储桶中新增子文件夹(对应partition_0分区)时,Athena查询结果无法同步更新。我尝试了三种解决方案:
- 使用
MSCK REPAIR TABLE standardtable:无效,提示"Partitions not in metastore:"; - 使用
ALTER TABLE standardtable ADD PARTITION (partition_0={newdatasetname}) location = s3://...:有效,可在新增子文件夹时执行; - 重新运行Glue Crawler:有效,但担心爬取成本。
现咨询:
- 执行
ALTER TABLE命令与重新运行Glue Crawler的成本差异是什么? - 重新运行Glue Crawler相比
ALTER TABLE有何优势?
解答
一、成本差异
1. ALTER TABLE ADD PARTITION的成本
- 计算成本:仅执行元数据DDL操作,不会扫描S3中的实际数据,几乎无计算费用,仅产生极少量的API请求费用(可忽略)。
- 操作成本:需要手动或通过代码指定新增分区的名称和对应S3路径,若批量新增分区,需编写循环逻辑批量执行,维护成本略高。
2. Glue Crawler的成本
- 计算成本:按运行时长和处理的数据量计费,会扫描指定S3路径下的文件与文件夹结构。即使仅新增一个分区,也会遍历目标路径层级,若存储桶文件量大,扫描时间长,成本会相应增加。
- 操作成本:配置完成后可通过S3事件、定时任务自动触发,无需手动指定分区信息,运维成本低,但需承担扫描过程中的计算费用。
二、Glue Crawler相比ALTER TABLE的优势
- 批量分区自动识别:若一次性新增多个分区,Crawler可自动发现所有未注册的分区,无需逐个执行
ALTER TABLE命令,适合批量新增场景。 - 自动同步表结构:如果JSON文件的Schema发生变化(如新增字段、字段类型变更),Crawler会自动更新Glue元数据表的结构,而
ALTER TABLE仅能处理分区,无法感知Schema变化。 - 适配复杂分区结构:针对多层嵌套的分区路径(如年/月/日分级),Crawler可自动识别层级关系,无需手动编写多层
ALTER TABLE语句。 - 全自动化运维:可配置S3事件触发(如新增文件夹时自动启动)或定时任务,实现元数据同步完全自动化,无需人工介入或编写额外的分区管理代码。
内容的提问来源于stack exchange,提问作者jpjpjpjp
相关产品推荐
相关产品推荐

