ADF复制活动中字符串类型‘总成本’列逗号丢失问题排查
问题原因及解决办法
问题原因
ADF复制活动默认会对带千位分隔符的数字字符串执行自动类型转换:当源列是字符串但内容符合1,234.56这类带逗号的数字格式时,ADF会自动将其解析为数值类型,移除千位分隔符(逗号)后写入目标库。无论目标PostgreSQL列是字符串还是decimal类型,都会触发这个默认行为,导致逗号丢失。
解决办法
场景1:先保留带逗号的字符串,再转decimal
如果需要先完整保留带逗号的字符串到PostgreSQL,再做类型转换:
- 关闭ADF自动类型转换
- 打开复制活动的「设置」标签页,找到「类型转换」模块,将「自动类型转换」切换为关闭。
- 确保源数据集的"Total Costs"列类型设为
String,目标PostgreSQL列类型设为text或varchar。
完成后重新运行管道,PostgreSQL中会保留带逗号的原始字符串。
- PostgreSQL内转换为decimal
执行SQL语句移除逗号并转换类型:ALTER TABLE your_target_table ALTER COLUMN "Total Costs" TYPE decimal USING REPLACE("Total Costs", ',', '')::decimal;
场景2:ADF内直接转换为decimal后写入(推荐)
直接在ADF中完成字符串到decimal的转换,避免后续数据库操作:
- 复制活动显式映射配置
- 进入复制活动的「映射」标签页,删除自动生成的映射规则,手动添加映射:
- 源列:"Total Costs"(String类型)
- 目标列:设置为decimal类型
- 点击映射行的「类型转换」按钮,设置「源类型格式」为
NumberFormat,并填写格式字符串(如#,##0.00适配带两位小数的千位分隔格式,整数则用#,##0)。
- 进入复制活动的「映射」标签页,删除自动生成的映射规则,手动添加映射:
- 数据流动处理(复杂场景)
如果复制活动的类型转换无法适配你的格式,用数据流动处理:- 创建数据流动,添加「派生列」转换,使用表达式替换逗号并转decimal:
toDecimal(replace("Total Costs", ',', '')) - 将处理后的列映射到PostgreSQL目标表的decimal类型列,运行数据流动管道。
- 创建数据流动,添加「派生列」转换,使用表达式替换逗号并转decimal:
验证
运行管道后检查PostgreSQL数据:场景1会保留带逗号的字符串,场景2则直接存储decimal类型的数值。
内容的提问来源于stack exchange,提问作者clubkli
相关产品推荐
相关产品推荐

