azure - 使用 Azure 数据工厂将文件内容从 Azure 存储复制到 Azure SQL Db

标签 azure azure-storage azure-data-factory

第一次发帖,长期读者。

第三方提供商每天将 CSV 文件上传到共享的 Azure Blob 存储。这些文件具有特定的前缀,文件名中带有时间戳,并且驻留在同一目录中。 F.i. “dw_palkkatekijat_20170320T021”每个文件都会包含前一个文件的所有数据,加上前一天新添加的数据。我想将所有文件中的所有行导入到 Azure SQL DB 中的 SQL 表中。这个我能做。

我遇到的问题是我不知道如何将文件名添加到表中的单独列中,因此我可以分隔行来自哪个文件,并且仅使用最新的行。我需要导入所有文件的内容并存储文件的所有“版本”。有没有办法可以将文件名作为 SQL 存储过程的参数发送?或者有什么替代方法来处理这个问题?

感谢您的帮助。

最佳答案

在您所描述的当前情况下,您将无法获得确切的文件名。 ADF 不是数据转换服务,因此不会为您提供此级别的功能...我希望它能提供!

但是,有几个选项可以获取文件名或类似的使用内容。 我认为没有一个是完美的!

选项 1(我认为最好的选择!)

正如你所问。将参数传递给 SQL DB 存储过程。使用 ADF 事件参数属性当然可以实现这一点。

作为参数传递什么?...

好吧,如果 Blob 存储中的源文件的文件名中有明确定义的日期和时间。这是您在输入数据集定义中已使用的内容,然后将其传递给过程。将其存储在 SQL DB 表中。然后您可以计算出文件何时加载、何时加载以及重叠的时间段。也许?

您可以在事件中访问数据集的时间片开始时间。 JSON 示例...

    "activities": [
        {
            "name": "StoredProcedureActivityTemplate",
            "type": "SqlServerStoredProcedure",
            "inputs": [
                {
                    "name": "BlobFile"
                }
            ],
            "outputs": [
                {
                    "name": "RelationalTable"
                }
            ],
            "typeProperties": {
              "storedProcedureName": "[dbo].[usp_LoadMyBlobs]",
              "storedProcedureParameters": {
                  //like this:
                  "ExactParamName": "$$Text.Format('{0:yyyyMMdd}', Time.AddMinutes(SliceStart, 0))" //tweak the date format
              }
            }, //etc ....

选项 2(大量工作)

为自己创建一个中间人 ADF 自定义事件,用于读取文件、加上文件名并将值添加为列。

ADF 中的自定义事件基本上为您提供了执行任何操作的可扩展性,因为您必须在 C# 中设计数据转换行为。

如果您想沿着这条路线走下去,我建议您了解使用自定义事件所涉及的内容。需要付出更多努力,并且需要 Azure Batch 服务。

选项 3(完全过度杀伤)

使用 Azure 数据湖分析服务!采用与选项 2 相同的方法。使用数据湖中的 USQL 解析文件并将文件名包含在输出数据集中。在 USQL 中,您可以传递文件名通配符作为提取器的一部分,并在输出数据集中使用它。

我认为这个选项太过分了,因为仅仅为了读取文件名而连接完整的数据湖服务就太过分了。实际上,数据湖可能会取代您的 SQL DB 层并免费为您提供文件名转换。

顺便说一下,您不需要使用 Azure Data Lake 存储来存储源文件。您可以授予分析服务对现有共享 blob 存储帐户的访问权限。但您只需要它来支持分析服务。

选项 4

重新思考并使用 Azure Data Lake 而不是 Azure SQL DB??????

希望这有帮助

关于azure - 使用 Azure 数据工厂将文件内容从 Azure 存储复制到 Azure SQL Db,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42922298/

相关文章:

c# - Azure WebJobs SDK 和模拟器 - 触发器不起作用

azure - Azure 授权中 SAS 和 ACS 之间的最大区别是什么?

azure - ADF 链接服务连接字符串更新

azure - 在 Azure 数据工厂数据映射事件中使用参数

azure - 文件系统限制存储网站azure

azure - 如何为 Databricks 的 azure daafactory 覆盖 CI/CD 管道的参数(工作区 Url 和集群 ID)

azure - 有没有办法以编程方式将 YAML 文件存储在 Azure Key Vault 中?

azure - Azure 应用程序服务中的 Signalr 不适用于 WebSockets

azure - Azure 流分析中的限制事件

Azure:将powershell的结果存储到存储帐户中