AWS DMS迁移S3 CSV到DynamoDB时JSON列无法写入为Map类型
AWS DMS迁移S3 CSV中JSON列到DynamoDB Map类型失败问题处理
问题场景
执行S3存储的CSV格式数据到DynamoDB的迁移任务时,表中部分列存储JSON格式内容,需要将这类列写入为DynamoDB Map(dynamodb-map)类型。
源数据样例结构如下:
<table border="1"> <tr> <th>userId</th><th>brandId</th><th>createdBy</th><th>modifiedBy</th><th>preferences</th><th>version</th> </tr> <tr> <td>TU0001</td> <td>TEST BRAND</td> <td>{"channel":{"S":"website"},"date":{"S": "2022-06-13T08:16:26.300Z"},"userId":{"S":"TU0001"}}</td> <td>{"channel":{"S":"website"},"date":{"S": "2022-06-13T015:26:10.200Z"},"userId":{"S":"TU0001"}}</td> <td>{"Colour": {"S": "Red" },"Size":{"S": "XL" }}</td> <td>1</td> </tr> </table>
目标DynamoDB表结构和源表完全一致,仅上述JSON字段需要存储为dynamodb-map类型。实际使用AWS DMS执行迁移时,JSON内容始终被识别为字符串类型写入,未按预期转为Map结构。
已尝试配置
首次使用的属性映射规则如下:
"attribute-mappings": [ { "target-attribute-name": "userId", "attribute-type": "scalar", "attribute-sub-type": "string", "value": "${userId}" }, { "target-attribute-name": "brandId", "attribute-type": "scalar", "attribute-sub-type": "string", "value": "${brandId}" }, { "target-attribute-name": "createdBy", "attribute-type": "document", "attribute-sub-type": "dynamodb-map", "value": { "M": { "S": "${createdBy}" } } }, { "target-attribute-name": "modifiedBy", "attribute-type": "document", "attribute-sub-type": "dynamodb-map", "value": { "M": { "S": "${modifiedBy}" } } }, { "target-attribute-name": "preferences", "attribute-type": "document", "attribute-sub-type": "dynamodb-map", "value": { "M": { "S": "${preferences}" } } }, { "target-attribute-name": "version", "attribute-type": "scalar", "attribute-sub-type": "number", "value": "${version}" } ]
调整Map取值配置为如下形式后,迁移后DynamoDB对应字段为空Map:
"value": { "M": "${preferences}" }
解决方法
配置不生效的根因:
- S3源端默认将CSV所有列按纯字符串读取,不会自动解析列内存储的JSON内容
- 映射规则写法错误:手动给
M字段赋值字符串、或者嵌套S类型,属于手动构造了不符合DynamoDB格式要求的Map结构,DMS无法识别时要么把整个值当字符串写入,要么直接写入空Map
按以下步骤调整即可:
- 修改S3源端点配置,在额外连接属性中添加参数
parseJsonAsString=false。该参数开启后,DMS会自动识别CSV列中符合规范的JSON内容,将其解析为结构化文档类型,不再按纯字符串处理。 - 调整所有Map类型字段的映射规则,删除手动嵌套的
M、S结构,直接引用源字段即可。以preferences字段为例,修正后的配置为:{ "target-attribute-name": "preferences", "attribute-type": "document", "attribute-sub-type": "dynamodb-map", "value": "${preferences}" }createdBy、modifiedBy字段按相同逻辑修改。 - 提前校验源CSV数据:确认JSON列的内容是标准JSON格式,无多余转义符、引号不配对、尾逗号等格式问题。如果JSON格式不合法,DMS解析失败时仍会降级写入字符串,或者直接写入空值。
配置调整完成后重启DMS迁移任务,建议先使用小批量数据做验证:
- 查看任务日志,无JSON解析相关报错
- 抽查DynamoDB目标数据,对应字段类型为
Map,内部键值结构和源JSON完全一致
内容的提问来源于stack exchange,提问作者VistaDev
相关产品推荐
相关产品推荐

