如何在Glue Catalog中实现不存在建表、存在则更新表结构
Glue Catalog 表不存在创建、存在更新的实现方案
- 方案1:使用
CREATE OR REPLACE EXTERNAL TABLE语法全量更新表定义
Glue Catalog原生支持Hive兼容的CREATE OR REPLACE语法,完全可以替代你现在用的CREATE EXTERNAL TABLE IF NOT EXISTS,效果是表不存在时自动创建,表已存在时直接用最新的DDL覆盖原有表定义,不管是改字段类型、增减字段、修改存储属性、表属性都可以直接生效,不需要先删表。
你可以把原来的建表语句改成如下形式:
CREATE DATABASE IF NOT EXISTS glue_catalog; CREATE OR REPLACE EXTERNAL TABLE glue_catalog.date ( file_dt date, end_dt date, -- 新增/修改字段直接在这里调整即可 new_col string ) PARTITIONED BY ( year string, month string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://bucket/prefix1/date' TBLPROPERTIES ( 'classification'='csv', 'columnsOrdered'='true', 'compressionType'='none', 'delimiter'='|', 'skip.header.line.count'='1', 'typeOfData'='file');
注意:该操作只会修改Glue Catalog中的元数据,不会改动S3路径下的原始数据,调整Schema后请确保和存储的实际数据格式兼容,避免查询报错。如果是分区表,调整字段后需要对历史分区生效的话,可以在语句末尾加上CASCADE参数。
方案2:使用
ALTER TABLE语句增量修改Schema
如果不需要全量覆盖表定义,只需要做局部调整,可以直接用对应的ALTER语句实现:- 修改字段名称/类型:
ALTER TABLE glue_catalog.date CHANGE COLUMN file_dt file_dt timestamp CASCADE;- 新增字段:
ALTER TABLE glue_catalog.date ADD COLUMNS (new_col string COMMENT '新增字段') CASCADE;- 修改表属性:
ALTER TABLE glue_catalog.date SET TBLPROPERTIES ('skip.header.line.count'='2');方案3:通过Boto3 SDK编程实现自定义逻辑
如果你是在自动化脚本中操作,可以调用AWS Glue的Open API实现更灵活的判断逻辑:先调用get_table接口查询指定表是否存在,不存在就调用create_table接口创建,存在就调用update_table接口传入最新的表定义即可。
内容的提问来源于stack exchange,提问作者TechNewbie
相关产品推荐
相关产品推荐

