使用Azure Data Factory将文件内容从Azure存储复制到Azure SQL Db

时间:2017-03-21 08:54:40

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

第一次海报,长时间阅读。

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

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

在目前的情况下,您已经描述过您无法获得确切的文件名。 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批处理服务。

选项3 (总矫枉过正)

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

我将此选项标记为过度杀戮,因为在完整的数据湖服务上进行抽薹只是为了读取文件名过多。实际上,数据湖可能会取代您的SQL数据库层,并免费为您提供文件名转换。

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

选项4

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

希望这有帮助