使用 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_time
和 SLA_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 数据库?
尝试将 csv 文件加载到雪花数据库时出现“在预期解析列时到达记录结尾”错误