如果超过 6 列,Azure 数据工厂复制管道失败

Azure Data factory Copy Pipeline failing if more than 6 columns

我正在尝试将数据从本地 PostgeSQL 或 MSSQL 中的视图复制到 Azure PostgreSQL 中的 table。当我将超过 6 列从源映射到接收器时,我似乎无法成功复制它。

我怀疑源列之一是问题所在,因此改变了映射的列,但如果总共复制的列少于 6 个,则所有列都会成功。 然后我尝试了不同的源和接收器 tables,结果相同。

如果我复制到一个中间 csv 文件,我可以 import/export 成功地无限列。

ADF 控制台中始终显示的错误输出是: "Operation on target Copy_7dp failed: Type=Npgsql.PostgresException,Message=08P01: invalid message format,Source=Npgsql,'"

Error output shown in the ADF console consistently is: "Operation on target Copy_7dp failed: Type=Npgsql.PostgresException,Message=08P01: invalid message format,Source=Npgsql,'"

你可能会从中找到一些线索old case which is similar to your error trace. Please see the solution in above link: https://github.com/npgsql/npgsql/issues/189#issuecomment-67001166

Basically, if the string value we try to persist using Npgsql was derived from MemoryStream.GetBuffer() it will explode, but if it came from MemoryStream.ToArray() it will work fine.

官方有说明document:

请注意,缓冲区包含可能未使用的已分配字节。例如,如果将字符串 "test" 写入 MemoryStream 对象,则从 GetBuffer 返回的缓冲区长度为 256,而不是 4,还有 252 字节未使用。要仅获取缓冲区中的数据,请使用 ToArray 方法;但是,ToArray 在内存中创建数据的副本。

但是,我怀疑这是ADF Postgresql连接器的缺陷,我们无法在使用级别调整任何传输源代码。(当然,您可以向azure adf团队反馈以获得官方声明)

目前,作为解决方法,您可以使用 csv 文件作为中介。将数据从本地数据库传输到 Azure Blob 存储中的 csv 文件。然后将数据传输到目标 postgresql 数据库。

在与 Microsoft 的 ADF 团队讨论后,他们告诉我 Postgresql 对一次可以写入的元素数量有 16 位限制。即如果(行大小 * 列大小)> 65536 它将引发此错误。

解决办法就是简单的减少Copy Data的Sink属性中的"Write batch size" activity e.g this image