DMS JSON脚本改造需求:基于关联表字段值控制目标列显示逻辑
实现MySQL到Redshift的DMS条件字段转换方案
嘿,我之前刚好处理过类似的DMS数据迁移逻辑,直接给你两个实用方案,适配你的需求场景:
方案一:用DMS自定义SQL转换规则(推荐)
AWS DMS支持在迁移过程中通过自定义SQL改写源数据,这是最适配全量+增量迁移的方式,不用额外做后续处理。
你只需要在DMS任务的**表映射(Table Mappings)**里,给Table Y加一个「转换规则(Transformation Rule)」,选择「自定义SQL(Custom SQL)」类型,然后写入以下逻辑:
SELECT y.y_id, -- 核心条件逻辑:关联Table X的type字段,决定是否保留name值 CASE WHEN x.type = 1 THEN y.name ELSE NULL END AS name, y.x_id FROM Table_Y y -- 左连接保证即使X中无对应x_id,Y的记录也能正常迁移(此时name会被设为null) LEFT JOIN Table_X x ON y.x_id = x.x_id
配置小提示:
- 创建/编辑DMS迁移任务时,进入「Table mappings」环节
- 找到目标Table Y,点击「Add rule」
- 规则类型选「Transformation」,子类型选「Custom SQL」
- 粘贴上面的SQL,替换成你实际的表名
- 保存规则后完成任务配置即可
要注意的细节:
- 确保DMS的源MySQL端点有权限读取Table X和Table Y
- 提前确认Redshift目标表的
name字段允许为NULL,如果原来设了NOT NULL,需要先在Redshift里执行ALTER TABLE Table_Y ALTER COLUMN name DROP NOT NULL;修改结构 - 测试时先迁移小批量数据,验证结果是否符合你的示例(比如y_id=2的name应该变成null)
方案二:Redshift端后续修正(适合一次性全量迁移)
如果你的迁移是一次性全量任务,也可以先把两张表完整迁移到Redshift,再执行UPDATE语句修正name字段:
UPDATE Table_Y y SET name = NULL FROM Table_X x WHERE y.x_id = x.x_id AND x.type != 1;
这个方式简单直接,但缺点是没法自动处理后续的增量数据,适合不需要持续同步的场景。
内容的提问来源于stack exchange,提问作者Lotem Kirshner
相关产品推荐
相关产品推荐

