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



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

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

如果我复制到中间csv文件,我可以成功导入/导出无限的列。

ADF 控制台中显示的错误输出始终为: "对目标Copy_7dp的操作失败:类型=Npgsql.PostgresException,消息=08P01:无效的消息格式,源=Npgsql,'">

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

解决方案是简单地减少复制数据活动的接收器属性中的"写入批大小",例如此图像

ADF 控制台中显示的错误输出始终为:"操作 目标Copy_7dp失败:类型=Npgsql.PostgresException,消息=08P01: 无效的消息格式,源=Npgsql,'">

您可能会在这个旧案例中找到一些类似于错误跟踪的线索。请参阅上述链接中的解决方案:https://github.com/npgsql/npgsql/issues/189#issuecomment-67001166

基本上,如果我们尝试使用 Npgsql 持久化的字符串值是 派生自 MemoryStream.GetBuffer(( 它会爆炸,但如果它来了 从 MemoryStream.ToArray(( 它将正常工作。

官方文件解释道:

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

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

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

相关内容

  • 没有找到相关文章

最新更新