从MongoDB导入数据到AWS Glue时出现重复列报错该如何解决?
MongoDB导入AWS Glue报重复列异常的解决方案
该错误的核心原因是MongoDB为无结构化schema的文档型数据库,同集合内不同文档可能存在大小写不一致的同名字段、不同嵌套层级下的重名字段,而AWS Glue默认依赖Spark进行schema推断,Spark默认关闭大小写敏感,会将上述场景的字段识别为重复列导致任务失败,可通过以下方法处理:
- 显式指定数据源schema,关闭自动推断
提前梳理目标集合需要同步的字段列表,手动构造符合业务要求的StructType schema对象,在初始化MongoDB数据源时通过withSchema方法传入指定schema,跳过自动推断步骤,从根源避免识别到冗余重复字段。 - 开启Spark大小写敏感配置
在Glue作业的「作业参数」中添加配置项:--conf spark.sql.caseSensitive=true,开启后Spark会将大小写不一致的同名字段识别为独立列,不会触发重复列报错。如果重复字段为完全相同的大小写拼写,该配置不生效,需搭配其他方案使用。 - 源端MongoDB提前聚合清洗数据
在读取MongoDB数据时直接传入聚合查询语句,通过MongoDB的$project算子只保留需要的同步字段,或通过$rename算子将重名字段重命名为唯一名称,从数据源端消除重复列的存在,再将聚合结果返回给Glue处理。 - 配置嵌套字段分隔符避免层级重名
如果重复字段出现在不同嵌套层级,可在Glue MongoDB连接的额外选项中添加配置:"mongodb.sql.nestedFieldDelimiter":"_",开启后嵌套字段会自动携带父级路径作为前缀,例如嵌套在user下的column1会被命名为user_column1,不会和根目录的column1产生重名冲突。 - 半结构化加载后手动去重列
先将MongoDB数据以原生DynamicFrame格式加载,不做schema解析,后续通过自定义函数提取目标字段,直接丢弃重复的冗余字段,再转换为结构化DynamicFrame写入Redshift即可。
内容的提问来源于stack exchange,提问作者Miroslav Petrovic
相关产品推荐
相关产品推荐

