解决AWS Glue读取MongoDB写入S3时STRING转Integer类型错误
AWS Glue PySpark连接MongoDB偶发类型转换错误解决方案
问题根因
MongoDB为无固定Schema的文档型数据库,Spark默认仅采样前1000条文档推断数据类型:若采样范围内某字段为整数类型,但后续文档中同名字段为空字符串/字符串类型,执行全量数据读取时就会触发类型转换异常。偶发的原因是每次作业运行时采样的数据集可能存在差异,有时采样刚好覆盖了多类型的同名字段,有时未覆盖。
可行解决方案
- 方案1:全局强制所有字段转为字符串,覆盖所有嵌套层级
你之前的resolveChoice仅指定了部分字段,未覆盖的字段仍会触发错误,可使用通配符规则适配所有层级的字段:
# 所有字段、所有嵌套层级的类型冲突统一转为string resolve_dyf = datasource0.resolveChoice(specs = [("*", "cast:string"), ("*.*", "cast:string"), ("*[].*", "cast:string")])
- 方案2:读取Mongo时添加连接器参数,关闭类型推断、开启类型容错
直接通过from_options读取Mongo时添加如下连接参数,避免推断Schema出错:
datasource0 = glueContext.create_dynamic_frame_from_options( connection_type = "mongodb", connection_options = { "uri": "<connection_string>", "database": "<mongo_db_name>", "collection": "<mongo_collection>", "username": "<db_username>", "password": "<db_password>", # 新增以下参数 "inferSchema": "false", # 关闭Schema推断,避免采样偏差 "sampleSize": "100000", # 若需推断Schema可扩大采样范围,避免采样数据代表性不足 "failOnInvalidType": "false" # 类型转换失败时返回null,不抛出异常终止作业 } )
- 方案3:直接读取整文档为JSON字符串,完全规避类型转换
如果最终输出就是JSON格式,可直接将每个Mongo文档读取为单个JSON字符串列,写入S3时直接输出即可:
# 配置Spark参数,读取Mongo文档为原始JSON字符串 spark.conf.set("spark.mongodb.read.output.format", "json") datasource0 = glueContext.create_dynamic_frame_from_options( connection_type = "mongodb", connection_options = { "uri": "<connection_string>", "database": "<mongo_db_name>", "collection": "<mongo_collection>", "username": "<db_username>", "password": "<db_password>" } ) # 直接写入S3即可,不需要额外处理结构
- 方案4:避免使用固定Schema的Glue Catalog表读取
Glue Catalog中的表Schema是固定的,若Mongo集合新增字段或字段类型发生变化,就会触发转换错误。如果Mongo Schema频繁变化,建议直接使用from_options读取,不要绑定Catalog表。
内容的提问来源于stack exchange,提问作者Aatisha
相关产品推荐
相关产品推荐

