Azure Data Factory无列映射向PostgreSQL同步bit值的Copy活动失败
CSV同步PostgreSQL BIT类型列转换错误解决方案
问题根因
PostgreSQL的BIT类型在Copy活动的默认类型映射规则中会被识别为字节数组(ByteArray)类型,而CSV中存储的0/1是纯文本字符串,默认转换逻辑会将字符串当做十六进制值处理,单字符的0/1不符合十六进制转字节的长度要求(每1字节对应2位十六进制字符),因此抛出类型转换错误。student表的INT、VARCHAR类型和CSV字符串的默认转换规则兼容,因此同步正常。
可选用的解决方案
方案1:修改表结构(优先推荐)
将employee表的is_active列类型从BIT修改为BOOLEAN,PostgreSQL原生支持将字符串格式的0/1、true/false自动转换为BOOLEAN值,不需要修改任何Copy活动配置,也不影响原有逻辑的兼容性,适配所有表通用的无映射同步规则。
执行SQL修改列类型:
ALTER TABLE employee ALTER COLUMN is_active TYPE BOOLEAN USING is_active::boolean;
方案2:配置显式列映射(无需改表结构)
如果不允许修改表结构,单独为employee表的Copy活动配置自定义映射规则即可:
- 在Copy活动的源配置页,将
is_active列的源数据类型手动指定为Int16或者Boolean,替换默认的String类型 - 在Sink映射页,手动绑定源端
is_active列和目标端is_activeBIT列,Copy活动会自动将数字0/1转换为对应的BIT值
如果是用foreach遍历所有文件的通用同步逻辑,可以在foreach中增加判断分支:当前处理的文件名等于employee.csv时,调用配置了自定义映射的Copy活动,其他文件走原有默认无映射的同步逻辑,不影响其他表的同步效率。
方案3:调整CSV导出格式
如果不想修改同步任务配置,可以在CSV导出环节调整is_active列的输出格式,将原来的0/1改为2位十六进制格式的00/01,匹配BIT类型默认的字节数组转换规则,无需修改数据库侧和同步任务侧的配置。
内容的提问来源于stack exchange,提问作者Rabiul Aleem
相关产品推荐
相关产品推荐

