【问题标题】:Azure Data Factory Get Metadata to get blob filenames and transfer them to Azure SQL database tableAzure 数据工厂获取元数据以获取 blob 文件名并将它们传输到 Azure SQL 数据库表
【发布时间】:2020-10-14 18:07:13
【问题描述】:

我正在尝试使用 Azure 数据工厂中的 Get Metadata 活动来获取 blob 文件名并将它们复制到 Azure SQL 数据库表。 我遵循本教程:https://www.mssqltips.com/sqlservertip/6246/azure-data-factory-get-metadata-example/

这是我的管道,复制数据 > 源是我的 Blob 存储中的 Blob 文件的源目标。我需要将我的源文件指定为二进制文件,因为它们是 *.jpeg 文件。

对于我的复制数据 > Sink,它是 Azure SQL 数据库,我启用了“自动创建表”选项

在我的接收器数据集配置中,我必须选择一个表,因为如果我不在我的 SQL 数据库中选择表,验证将不会通过,即使该表与我想要的 blob 文件名完全不相关得到。

问题 1:我是否应该先在 SQL DB 中创建一个新表,以使列与我要提取的 blob 文件名匹配?

然后,我尝试验证管道并收到此错误。

Copy_Data_1
Sink must be binary when source is binary dataset.

问题 2:如何解决此错误?我必须将源的文件类型选择为二进制,因为这是创建源数据集时的步骤之一。因此,当我选择作为 Azure SQL 表的接收器数据集时,我不必选择数据集的类型,因此它似乎不匹配。

非常感谢您。

新管道的新截图,我现在可以在 json 输出文件中获取文件名的 itemName。

现在我在 Get_File_Name2 活动之后添加 Copy Data 活动并将它们连接在一起以尝试将 json 输出文件作为源数据集。

但是,在将类型指定为 json 之前,我需要先选择源数据集位置。但是,据我了解,这些输出 json 文件是 Get_File_Name2 活动的输出,它们尚未存储在 Blob 存储中。如何使复制数据活动读取这些 json 输出文件作为源数据集?

2020 年 10 月 14 日更新 这是我的新活动存储过程,我按照建议添加了参数,但是我将名称更改为 JsonData,因为我的存储过程需要此参数。

这是我的存储过程。

我在存储过程中收到此错误:

{
    "errorCode": "2402",
    "message": "Execution fail against sql server. Sql error number: 13609. Error Message: JSON text is not properly formatted. Unexpected character 'S' is found at position 0.",
    "failureType": "UserError",
    "target": "Stored procedure1",
    "details": []
}

但是当我检查输入时,它似乎已经成功读取了 json 字符串 itemName。

但是,当我检查输出时,它不存在。

【问题讨论】:

  • 源文件是 *.jpeg(image) 文件而不是像 csv 这样的数据文件,二进制格式无法加载到 Azure SQL 数据库。不支持。我们无法帮你解决!
  • 你好@Leon Yue,你能再检查一下我的步骤吗?我没有尝试将 jpeg 文件本身加载到 SQL 表中,这当然没有意义,因为我们不保留图像文件 i。关系数据库。我试图获取 jpeg 文件的文件名并将它们放入 SQL 表中。这就是我尝试使用 Get Metadata 的原因,这是正确的做法吗?
  • 是的。但请不要在复制活动中使用二进制作为源。您的整个工作流程可能是:获取元数据(获取所有 .jpeg 文件名)--> foreach(循环文件名)--> if 条件(我不知道它用于什么)-->true active(加载到Azure SQL)。
  • 自动创建表不适用于文件名!这取决于文件数据。您需要创建一个表来接收这些文件名。
  • 您好@Leon Yue 非常感谢您的建议。我也找到了类似的解决方案,所以我修改了我的管道,如下所示: Get Metadata 1 with dataset pointing to blob storage on blob files, here I add file list = Child items 然后通过设置 @activity('Get_File_Name1') 连接到 ForEach 循环.output.childItems 和 Get Metadata 内部的活动也指向具有 FileName 值作为 @item().name 的 blob 存储。运行此管道后,似乎在 json 输出文件中越来越接近,我得到了文件名的 itemName 值。请看上面的截图。

标签: stored-procedures azure-sql-database metadata azure-data-factory copydataset


【解决方案1】:

其实你可以使用Get metadata output json作为参数,然后调用存储过程:Get metedata-->Stored Procedure!

您只需要专注于存储过程的编码即可。

获取元数据输出childitems:

{
   "childItems": [
        {
            "name": "DeploymentFiles.zip",
            "type": "File"
        },
        {
            "name": "geodatalake.pdf",
            "type": "File"
        },
        {
            "name": "test2.xlsx",
            "type": "File"
        },
        {
            "name": "word.csv",
            "type": "File"
        }
}

存储过程:

@activity('Get Metadata1').output.childitems

关于如何创建存储过程(从json对象获取数据),可以参考这篇博客:Retrieve JSON Data from SQL Server using a Stored Procedure

【讨论】:

  • 您好@Leon Yue 非常感谢您的帮助。我要试试这个。只是一个问题,所以您认为我不需要在 Get Metadata 和 Store Procedure 之间使用 ForEach 循环 Activity 对吗?我添加了 ForEach 循环活动,因为我在这里看到了这个线程的另一个回复:stackoverflow.com/questions/53764072/…
  • 对不起另一个问题,这是否意味着我应该首先在我的 Azure SQL 数据库中创建一个表(以及存储过程)?在执行此工作流程之前?
  • @Shuti 是的,你不需要 foreach。首先创建表并使用存储过程从获取元数据输出中插入数据。获取元数据输出作为存储过程参数。
  • 好的,非常感谢@Leon Yue,我会试试这个,让你知道这是否有效
  • @Shuti 好的,希望一切顺利!
猜你喜欢
  • 2016-10-02
  • 2021-11-04
  • 2016-08-30
  • 2022-08-05
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 2021-12-05
相关资源
最近更新 更多