使用 Azure 数据工厂将数据加载到雪花时出现问题

Posted

技术标签:

【中文标题】使用 Azure 数据工厂将数据加载到雪花时出现问题【英文标题】:Trouble loading data into Snowflake using Azure Data Factory 【发布时间】:2021-11-24 18:30:34 【问题描述】:

我正在尝试使用 Azure 数据工厂将一个小型数据表从 Azure SQL 导入到 Snowflake。

通常我使用这种方法没有任何问题: https://docs.microsoft.com/en-us/azure/data-factory/connector-snowflake?tabs=data-factory#staged-copy-to-snowflake

但现在我遇到了一个问题,源表如下所示: 有两列 SLA_Processing_start_timeSLA_Processing_end_time 的数据类型为 TIME

不知何故,在将数据写入暂存区域时,数据会更改为0:08:00:00.0000000,0:17:00:00.0000000 之类的内容,这会导致如下错误:

Time '0:08:00:00.0000000' is not recognized File

映射如下所示:

我已尝试添加 TIME_FORMAT 属性,例如 'HH24:MI:SS.FF',但这并没有帮助。 关于为什么08:00:00 变成0:08:00:00.0000000 以及如何避免它的任何想法?

【问题讨论】:

您能在“映射”选项卡中显示您拥有的内容吗?雪花侧的柱子是什么类型的? 我实际上一直在想时间列(默认 TIME(9))的精度可能太高,这可能是问题所在。 你可以使用函数来转换源时间吗?您可以使用to_time 来匹配您想要的格式。 【参考方案1】:

最后,我能够在我的环境中重新创建您的案例。 我有同样的错误,前导零提前出现(0: 08:00:00.0000000)。 我什至抓住了它在 BlobStorage 上创建的文件,并且零已经在那里了。 此活动创建没有任何错误处理(双引号、转义字符等)的 CSV 文本文件。 在 Snowflake 端,它会创建一个临时 Stage 并加载这些文件。 不幸的是,它不会自行清理并在 BlobStorage 上留下空目录。此外,您不能使用 ADLS Gen2。 :(

ADF 中的这个连接器不是很好,我什至在 AWS 环境中使用它都有问题,我不得不在 Azure 中设置一个 Snowflake 帐户。 我尝试了一些解决方法,您似乎有两种选择:

    简单解决方案:

    把两边的数据类型改成DateTime,然后在Snowflake端变换这个属性。如果你不能在源端改变类型,你可以只使用“查询”选项并使用 CAST / CONVERT 函数编写 SELECT。

    推荐解决方案:

    使用 Copy data 活动将您的数据插入 BlobStorage / ADLS(这个活动还是这样做了),最好采用 parquet 文件格式和自行设计的结构 (Best practices for using Azure Data Lake Storage)。 为您的 BlobStorage / ADLS 创建一个永久的 Snowflake Stage。 添加查找活动并将数据从那里的文件加载到表中,您可以使用常规查询或编写存储过程并调用它。

    多亏了这一点,您将可以更好地控制正在发生的事情,并为您的组织构建 DataLake 解决方案。

【讨论】:

嗨迈克尔,我已将您的答案(目前唯一一个)标记为解决方案,因为它接近我自己的解决方法。对我来说,在内置的直接复制到雪花功能中似乎存在一个错误,并且由于我无法弄清楚如何控制该中间 blob 格式,我最终手动执行了该步骤。 谢谢,请考虑我的解决方案,它更清洁,更高效。【参考方案2】:

我自己的解决方案非常接近公认的答案,但我仍然认为内置的直接到雪花复制功能存在错误。

由于我不知道如何控制在直接到 Snowflake 副本上创建的中间 blob 文件,我最终将一个普通文件写入 blob 存储,然后再次读取,以加载到 Snowflake

因此,我将其手动拆分为两个操作,而不是一步完成

从 AzureSQL 获取数据并将其作为纯文本文件保存在 Blob 存储中的一个操作

然后是第二个动作,即读取文件并将其加载到 Snowflake 中。

这可行,并且应该与直接复制到 Snowflake 所做的基本相同,因此存在错误假设。

【讨论】:

在我看来,错误出在 ADF 连接器上。此解决方案将存在性能问题。我们向 BlobStorage 发送数据两次,存在出错的风险以及不必要的转换。

以上是关于使用 Azure 数据工厂将数据加载到雪花时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用数据工厂将数据从 Azure Blob 存储增量加载到 Azure SQL 数据库?

如何在 Azure 数据工厂中为雪花连接执行下推优化

尝试将 csv 文件加载到雪花数据库时出现“在预期解析列时到达记录结尾”错误

使用 SAS 令牌从 Azure 阶段读取时出现雪花错误

将最新的文件夹从 azure blob 存储加载到 azure 数据工厂

将数据从 ADLS Gen2 加载到 Azure Synapse 时出错