Redshift Spectrum查询S3数据遇oid保留字冲突,无需修改源文件如何解决
oid属于Redshift内置系统保留列名,外部表如果出现同名就会触发元数据加载冲突,以下是无需修改S3源文件的解决方案:
解决方案
方案1:修改Glue Data Catalog的表字段映射(最推荐)
该方案仅修改元数据映射规则,完全不触及源文件内容:
- 进入AWS Glue控制台,找到对应数据库下的目标表,点击编辑表
- 在字段列表中找到
oid字段,将字段名修改为非保留字名称,例如source_oid、custom_oid均可 - 保存修改后回到Redshift重新执行查询即可,字段映射会自动匹配S3源数据的oid列,无需额外调整
注意:如果你的源文件是CSV等按字段顺序匹配的格式,不要修改其他字段的排列顺序;如果是Parquet、JSON等按字段名匹配的格式,需要确认修改后的字段对应的源列映射仍为
oid。
方案2:Redshift侧手动创建外部表自定义列名
如果不想修改Glue Crawler自动生成的表结构,可以直接在Redshift中自定义外部表,显式重命名冲突字段:
CREATE EXTERNAL TABLE spectrum_db.custom_table ( -- 其余原有字段保持名称、类型不变 source_oid varchar, -- 原oid字段重命名为非保留字 pid int, -- 剩余字段按原结构补齐 ) -- 以下参数和原外部表配置保持一致 ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS PARQUET LOCATION 's3://你的源数据存储路径/' TABLE PROPERTIES ('serialization.null.format' = '');
创建完成后直接查询该自定义外部表即可,不会触发保留字冲突。
方案3:查询时显式指定列(临时验证用)
如果仅需要临时查询且不需要用到oid字段,可以不用select *语法,手动列出所有需要查询的字段即可避开冲突:
select pid, [其他需要查询的字段] from db.table order by pid desc limit 1
注意:该方案仅适用于查询不需要用到
oid字段的场景,若需使用该字段请选择前两种方案。
内容的提问来源于stack exchange,提问作者dahuin
相关产品推荐
相关产品推荐

