AWS Glue迁移DynamoDB写入数字集合(NS)报ValidationException求助
问题根因
你遇到的报错是AWS Glue的DynamoDB写入连接器的类型推断逻辑缺陷导致的:连接器仅能识别由int/float类型元素组成的Python集合为DynamoDB的NS(数字集合)类型,由Decimal元素组成的集合会被判定为未知类型,序列化为空值后触发DynamoDB的ValidationException。
解决方案
方案1:快速修复(仅适合NS值全为整数的场景)
直接修改number_set函数的转换逻辑,将数值转成int类型即可兼容现有代码:
def number_set(datavalue): set_of_values = set() for value in datavalue: set_of_values.add(int(value)) return set_of_values
如果你的NS存在小数,可将int替换为float,但要注意float会存在精度损失,不适合对数值精度要求高的场景。
方案2:通用高精度兼容方案(推荐,支持所有数值场景)
完全避开Glue的自动类型推断,直接使用boto3批量写入DynamoDB,该接口原生支持Decimal类型的数字集合,不需要做额外类型转换。修改后的核心代码示例:
import boto3 dynamodb = boto3.resource('dynamodb', region_name='us-east-1') table = dynamodb.Table(destination_table) # 将DynamicFrame转成Python列表分批处理 records = mapped_dyF.toDF().collect() batch_size = 25 # DynamoDB批量写入单次最多25条 for i in range(0, len(records), batch_size): batch = records[i:i+batch_size] with table.batch_writer() as writer: for rec in batch: writer.put_item(Item=rec.asDict())
该方案完全规避了Glue的类型推断问题,同时保留了Decimal的高精度特性,适合通用DynamoDB迁移场景。
内容的提问来源于stack exchange,提问作者madhu sudhan
相关产品推荐
相关产品推荐

