如何使用Azure Data Factory将Parquet数值数组复制到PostgreSQL
ADF复制Parquet数值数组到PostgreSQL的可行解决方案
- 方案1:复制活动侧适配PostgreSQL数组语法
ADF原生复制活动暂不支持Parquet数值数组到PostgreSQL数组类型的直接自动映射,无需修改目标表字段类型,只需在源端用内联表达式将数组值处理为PostgreSQL可识别的数组字面量:将Parquet读取到的数值数组,拼接为{数值1,数值2,数值3}格式的字符串(PostgreSQL标准数组输入格式,不要保留原数组的方括号),示例转换表达式为concat('{', join(目标数组列名, ','), '}')。接收器映射时保持该列对应PostgreSQL的目标数值数组类型(如integer[]/numeric[])即可,PostgreSQL会自动将符合格式的字面量解析为对应数组类型,不会触发类型冲突报错。 - 方案2:使用映射数据流实现原生类型映射
替换普通复制活动为ADF映射数据流完成迁移:在源转换配置中开启Parquet复杂类型自动检测,数值数组列会被自动识别为数组复杂类型;接收器选择PostgreSQL数据集时,最新版集成运行时(IR)原生支持Parquet数值数组到PostgreSQL数组类型的直接映射,无需手动做格式转换。如果出现映射报错,先把自托管IR/ Azure IR升级到最新版本,旧版本IR存在复杂数组类型的映射兼容缺陷。 - 方案3:临时表中转(适配大数据量、高维数组场景)
该方案稳定性最高,不受ADF复杂类型支持边界限制:- 先在PostgreSQL中创建中转临时表,将原数组对应的列临时定义为
text类型,其余列保持和目标表一致 - 用ADF复制活动将Parquet文件全量写入临时表,这一步ADF会自动将数组序列化为文本写入,不会触发数据类型不支持报错
- 在PostgreSQL中执行转换语句,将临时表的文本列转换为目标数值数组类型后写入正式表,参考SQL如下:
数据校验完成后删除临时表即可。INSERT INTO 正式表名 (普通列1, 数值数组列, 普通列2) SELECT 普通列1, -- 兼容方括号、大括号两种序列化格式,统一转换为数值数组 string_to_array(trim(both '[]{}' from 数组列临时文本字段), ',')::numeric[], 普通列2 FROM 中转临时表名; - 先在PostgreSQL中创建中转临时表,将原数组对应的列临时定义为
避坑提示:不要将数组列转换为JSON数组格式字符串直接写入PostgreSQL数组类型列,PostgreSQL标准数组类型无法直接解析JSON格式的数组输入,会持续触发类型匹配错误。
内容的提问来源于stack exchange,提问作者Anupam Alok
相关产品推荐
相关产品推荐

