【问题标题】:Copying file contents from Azure Storage to Azure SQL Db using Azure Data Factory使用 Azure 数据工厂将文件内容从 Azure 存储复制到 Azure SQL Db
【发布时间】:2017-03-21 08:54:40
【问题描述】:

第一次发帖,老读者了。

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

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

感谢您的帮助。

【问题讨论】:

    标签: azure azure-storage azure-data-factory


    【解决方案1】:

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

    但是,有几个选项可以获取文件名或类似使用的名称。 我接受的都不是完美的!

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

    如你所愿。将参数传递给 SQL DB 存储过程。这当然可以使用 ADF 活动参数属性来实现。

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

    好吧,如果您在 blob 存储中的源文件在文件名中有明确定义的日期和时间。这是您在输入数据集定义中已经使用的内容,然后将其传递给 proc。将其存储在 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?????

    希望对你有帮助

    【讨论】:

    • 嗨@Paul,谢谢你的回答。选项#1绝对是我所追求的。有没有办法在某个容器的虚拟目录中使用“分区”来定义数据切片?截至目前,切片每天使用没有文件名的文件夹路径形成。因此,所有切片都将包含当时存在的所有文件。我当然可以挖掘行并始终找到具有最新开始切片的行,但这听起来有点笨拙。
    • 是的,您在 partition by 子句中定义的任何内容都可以包含在文件夹名称或文件名称中。例如:\RawData\{YYYY}\{MM}\{DD}\SomeFileName{HHMM}.txt
    • 是的,我肯定会的。只是看看如何做到这一点。例如,今天(2017-03-21)我收到了日期为(2017-03-20)的文件,我可以创建一个偏移一天的切片吗?
    • 你可以。或者。只需创建一个标准的每日时间片。但包括例如 3 天的长时间重试。这样您就不必担心偏移量。如果文件延迟发送给您,则在 3 天内不会出错。
    • 就可以了。非常感谢@Paul 抽出宝贵时间如此彻底地回答和解释!
    猜你喜欢
    • 2021-10-21
    • 2016-08-30
    • 2015-12-17
    • 2018-09-20
    • 2019-04-20
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多