Redshift Spectrum是否支持对外部表执行新增列操作?
你写的这条ALTER TABLE语句无法在Redshift Spectrum外部表上执行,会直接抛出不支持的错误。
Redshift Spectrum的外部表元数据并不存储在Redshift集群内部,而是托管在对应的外部元数据存储(最常见的是AWS Glue Data Catalog,也可能是自建的Hive Metastore),Redshift仅维护与该元存储的映射关系,因此不支持直接在Redshift侧执行ALTER TABLE ADD COLUMN的操作。
你可以选择以下两种可行方案完成操作:
- 方案1:在元数据存储侧修改表结构
如果你用的是AWS Glue,直接在Glue控制台找到对应表,编辑schema新增notes字段,类型选string(对应Redshift的character varying);如果是Hive Metastore,直接在Hive端执行加列的ALTER TABLE语句。修改完成后回到Redshift执行以下命令同步元数据即可:
如果你使用的是分区表,新增列需要对历史分区生效的话,需要同步给所有历史分区也加上该列的定义,否则查询历史分区时该列会返回NULL。ALTER TABLE spectrum.some_table SET TABLE DEFINITION; - 方案2:直接重建Redshift侧的外部表映射
外部表的DROP操作仅会删除Redshift内部的映射关系,不会影响你存放在S3上的原始数据。你可以先执行DROP TABLE spectrum.some_table;,再重新执行CREATE EXTERNAL TABLE语句,在原有字段的基础上新增notes character varying字段即可,重建后原有数据的查询完全不受影响,新增列如果S3的源文件里有对应字段就会返回实际值,没有的话默认返回NULL。
内容的提问来源于stack exchange,提问作者spak
相关产品推荐
相关产品推荐

