You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

按以下步骤调整即可:

  1. 修改S3源端点配置,在额外连接属性中添加参数parseJsonAsString=false。该参数开启后,DMS会自动识别CSV列中符合规范的JSON内容,将其解析为结构化文档类型,不再按纯字符串处理。
  2. 调整所有Map类型字段的映射规则,删除手动嵌套的M、S结构,直接引用源字段即可。以preferences字段为例,修正后的配置为:
    {
      "target-attribute-name": "preferences",
      "attribute-type": "document",
      "attribute-sub-type": "dynamodb-map",
      "value": "${preferences}"
    }
    
    createdBy、modifiedBy字段按相同逻辑修改。
  3. 提前校验源CSV数据:确认JSON列的内容是标准JSON格式,无多余转义符、引号不配对、尾逗号等格式问题。如果JSON格式不合法,DMS解析失败时仍会降级写入字符串,或者直接写入空值。

配置调整完成后重启DMS迁移任务,建议先使用小批量数据做验证:

  • 查看任务日志,无JSON解析相关报错
  • 抽查DynamoDB目标数据,对应字段类型为Map,内部键值结构和源JSON完全一致

内容的提问来源于stack exchange,提问作者VistaDev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 22:15:45