使用 Azure 数据工厂将数据加载到 Snowflake 时遇到问题
Trouble loading data into Snowflake using Azure Data Factory
-
azure-data-factory
-
azure-blob-storage
-
azure-sql-database
-
snowflake-cloud-data-platform
-
azure-data-factory-2
我正在尝试使用 Azure 数据工厂将少量 table 数据从 Azure SQL 导入 Snowflake。
通常我使用这种方法没有任何问题:
https://docs.microsoft.com/en-us/azure/data-factory/connector-snowflake?tabs=data-factory#staged-copy-to-snowflake
但现在我遇到了一个问题,来源 table 看起来像这样:
有两列 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
以及如何避免它有什么想法吗?
最后,我能够在我的环境中重新创建您的案例。
我有同样的错误,前导零提前出现 (0: 08:00:00.0000000)。
我什至抓取了它在 BlobStorage 上创建的文件,零已经存在。
activity 创建的 CSV 文本文件没有任何错误处理(双引号、转义字符等)。
在 Snowflake 端,它创建一个临时 Stage 并加载这些文件。
不幸的是,它不会自行清理并在 BlobStorage 上留下空目录。此外,您不能使用 ADLS Gen2。 :(
ADF 中的这个连接器不是很好,我什至在 AWS 环境中使用它时遇到问题,我不得不在 Azure 中设置一个 Snowflake 帐户。
我已经尝试了一些解决方法,您似乎有两个选择:
简单解决方案:
把两边的数据类型都改成DateTime,然后在Snowflake这边转换这个属性。如果你不能改变源端的类型,你可以只使用“查询”选项并使用 CAST / CONVERT 函数编写 SELECT。
推荐解决方案:
- 使用复制数据 activity 将数据插入 BlobStorage / ADLS(这个 activity 还是这样做了)最好是镶木地板文件格式和自行设计的结构(Best practices for using Azure Data Lake Storage).
- 为您的 BlobStorage/ADLS 创建一个永久的 Snowflake Stage。
- 添加查找 activity 并将数据从那里的文件加载到 table,您可以使用常规查询或编写存储过程并调用它。
因此,您将更好地控制正在发生的事情,并且您将为您的组织构建 DataLake 解决方案。
我自己的解决方案非常接近公认的答案,但我仍然认为内置直接复制到 Snowflake 的功能存在错误。
由于我不知道如何控制在直接到 Snowflake 的副本上创建的中间 blob 文件,我最终将一个普通文件写入 blob 存储,然后再次读取它以加载到雪花
因此,我不是一步完成所有操作,而是手动将其分为两个操作
从 AzureSQL 获取数据并将其作为纯文本文件保存在 blob 存储上的一个操作
然后是第二个操作,即读取文件并将其加载到 Snowflake。
这是有效的,并且应该与直接复制到 Snowflake 所做的基本相同,因此存在错误假设。
azure-data-factory
azure-blob-storage
azure-sql-database
snowflake-cloud-data-platform
azure-data-factory-2
我正在尝试使用 Azure 数据工厂将少量 table 数据从 Azure SQL 导入 Snowflake。
通常我使用这种方法没有任何问题: https://docs.microsoft.com/en-us/azure/data-factory/connector-snowflake?tabs=data-factory#staged-copy-to-snowflake
但现在我遇到了一个问题,来源 table 看起来像这样:
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
以及如何避免它有什么想法吗?
最后,我能够在我的环境中重新创建您的案例。 我有同样的错误,前导零提前出现 (0: 08:00:00.0000000)。 我什至抓取了它在 BlobStorage 上创建的文件,零已经存在。 activity 创建的 CSV 文本文件没有任何错误处理(双引号、转义字符等)。 在 Snowflake 端,它创建一个临时 Stage 并加载这些文件。 不幸的是,它不会自行清理并在 BlobStorage 上留下空目录。此外,您不能使用 ADLS Gen2。 :(
ADF 中的这个连接器不是很好,我什至在 AWS 环境中使用它时遇到问题,我不得不在 Azure 中设置一个 Snowflake 帐户。 我已经尝试了一些解决方法,您似乎有两个选择:
简单解决方案:
把两边的数据类型都改成DateTime,然后在Snowflake这边转换这个属性。如果你不能改变源端的类型,你可以只使用“查询”选项并使用 CAST / CONVERT 函数编写 SELECT。
推荐解决方案:
- 使用复制数据 activity 将数据插入 BlobStorage / ADLS(这个 activity 还是这样做了)最好是镶木地板文件格式和自行设计的结构(Best practices for using Azure Data Lake Storage).
- 为您的 BlobStorage/ADLS 创建一个永久的 Snowflake Stage。
- 添加查找 activity 并将数据从那里的文件加载到 table,您可以使用常规查询或编写存储过程并调用它。
因此,您将更好地控制正在发生的事情,并且您将为您的组织构建 DataLake 解决方案。
我自己的解决方案非常接近公认的答案,但我仍然认为内置直接复制到 Snowflake 的功能存在错误。
由于我不知道如何控制在直接到 Snowflake 的副本上创建的中间 blob 文件,我最终将一个普通文件写入 blob 存储,然后再次读取它以加载到雪花
因此,我不是一步完成所有操作,而是手动将其分为两个操作
从 AzureSQL 获取数据并将其作为纯文本文件保存在 blob 存储上的一个操作
然后是第二个操作,即读取文件并将其加载到 Snowflake。
这是有效的,并且应该与直接复制到 Snowflake 所做的基本相同,因此存在错误假设。