我正在设置一个链接到 Postgres SQL 服务器的 Azure 数据工厂,但我们的几个管道无法将数据从源 Postgres 表复制到 Azure SQL 服务器接收器表中。此问题似乎是由于“时间”转换失败所致。
虽然我能够验证不包含“时间”列的其他表是否已通过各自的管道正确引入,但我什至无法预览 Azure 数据中包含“时间”列的表的源数据集工厂。尝试这样做会返回以下错误:
Error code
DEDICATED_DPERRORCODE0
Details
Can't cast database type time without time zone to NpgsqlInterval
DEDICATED_DPERRORCODE0 链接会转到通用故障排除页面,不会涉及时区或转换错误。
ADF 似乎无法读取 Postgres 服务器的类型为“Time”的列,因为尝试将它们转换为没有时区的“Interval”类型。我不控制 Postgres 服务器;但是,我已经验证服务器确实具有相关列的“time(0)”类型。我缺乏知识来验证这些列是否附加了 postgres 文档中指定的时区。
在 postgresql 连接器的 Azure 文档中,它指定从 postgres 导入时,类型为“time”的源列将映射到“timespan”临时服务数据类型。然后将其转换为“时间”作为我的列的目标类型。在管道中,我可以看到 Azure 就是这样生成这些列的映射的。
如果我正确地读取了错误,则 Azure 正在尝试将时间列转换为间隔类型。这样做似乎需要一个它没有的时区,并且与所述文档不匹配(但也许 Azure 的临时 TimeSpan 数据类型秘密地是一个间隔?)。
如果我使用“复制数据”管道的源选项卡中的“查询”选项,如果我通过仅选择不需要此转换的列的查询,则可以返回结果,例如:
SELECT [Id]
FROM public.table
可能有一个查询允许将数据作为某种无错误类型传递,但是,理想情况下,我想解决问题的根源,而无需为每个导入数据集编写自定义 SQL,因为我们计划添加未来会有更多表格和时间列。
更改服务器会有些困难,但不一定不可能。有没有办法在 ADF 中指定一个时区,它可以自动使用它来进行 postgres 提供的映射,或者有其他方法可以成功地将 postgres 时间列转换为 ADF 可以使用的内容吗?
无法将没有时区的数据库类型时间转换为 NpgsqlInterval
尝试将时间类型转换或转换为不支持的间隔类型时,会出现上述错误。 如果要将具有时间类型列的 Azure PostgreSQL 表中的数据复制到 Azure SQL 表,请按照以下方法操作:
选择 PostgreSQL 表作为源并选择 SQL 接收器,如下所示:
启用自动创建表作为接收器中的表选项,如下所示:
转到映射,单击导入模式,然后无时区的时间列将更改为时间类型列,如下所示:
您将能够预览 PostgreSQL 表数据,如下所示:
表格将成功复制,没有任何错误。或者,您可以使用数据流在源的Projection选项卡中更改列的数据类型,如下所示: