【问题标题】:for-each is passing all the files at once in azure data factoryfor-each 在 azure 数据工厂中一次传递所有文件
【发布时间】:2021-01-31 20:25:55
【问题描述】:

我是 Azure 的新手,我遇到了 for-each 活动的问题。

场景:每天必须将 6 个文件从 blob 存储复制到 Azure SQL。

第 1 天:Vendors-01、Transactions01、Orders01、Customers01、purchase01、history01 第 2 天:Vendors-02、Transactions02、Orders02、Customers02、purchase02、history02 ...

问题:我的 for-each 是一次多次传递所有文件,而不是循环遍历它们并一次传递每个文件。

理想的世界应该是这样的

  1. 第一个循环:供应商文件
  2. 第二循环:事务文件
  3. 第三循环:订单文件
  4. 第 4 循环:客户文件
  5. 第 5 循环:购买文件
  6. 第 6 循环:历史文件

目前正在发生的事情:

  1. 第一个循环:供应商文件、交易文件、订单文件、客户文件、采购文件、历史文件
  2. 第二循环:供应商文件、交易文件、订单文件、客户文件、采购文件、历史文件 ...

这导致管道失败,因为 for-each 无法正常工作。

父管道

这是实际文件的数量 6,这就是管道执行 6 次的原因

这是管道每个循环的计数,它给了我 24 个文件而不是 3 个类似的文件,或者一次 1 个

我哪里漏了一步?

任何反馈都将受到高度赞赏!

提前谢谢????

【问题讨论】:

  • 您的Get File List 活动似乎有问题。例如,在您的第一个循环中,您只想获取所有供应商文件,但您在Get File List 活动的输出中获得了 24 个文件,这导致您在For Each File 活动中循环了 24 次。对吗?
  • @SteveZhao 是的,这是正确的,我的获取文件列表正在传递 24 个文件而不是 3 个文件。像我必须将类似的文件组织在一个文件夹中还是?
  • 你在For Each File活动中做什么,只使用复制活动?而且你的文件名前缀和你提供的样本一样吗?
  • @SteveZhao 在我的 for each 中,将有一个复制活动,将第 24 个文件中的每个文件从 blob 复制到 Azure SQL。文件命名约定在 blob 存储中将是这样的。 “Order_Number_items_29012021.txt”、“Order_Number_items_30012021.txt”、“Customers_Database_29012021.txt”、“Customers_Database_30012021.txt”..这些是blob中的一些文件,而且文件每天都在增长
  • 嗨@Maryam Al-Mansour,现在您在Azure SQL 中有6 种类型的文件和可能的6 个表。在您的父管道中,您要遍历 6 个 SQL 表。在您的子管道中,您是否要循环将一个文件复制到相应的表中?如果是这样,数字 3 来自哪里? Here is the count of each loop of the pipeline, it gives me 24 files instead of 3 similar files, or 1 at a time

标签: azure azure-functions azure-data-factory-2 parallel.foreach


【解决方案1】:

由于作业执行的可变部分是附加在文件末尾的日期而不是文件名,因此您可以通过各种方法获得结果:

  1. 创建日期及其处理状态的配置表。

Foreach 循环活动:它的值应该是我们需要处理的提取日期的数量(意味着我们需要复制文件的日期)

在 foreach 中,创建 6 个复制活动(一个用于每个文件名,如历史记录、订单等),其中源数据集需要是动态的以获取文件 @cancat("order_number",utcnow()) 之类的。

  1. 而不是在 FOReach 活动中有 6 个不同的复制活动, 因为 ADF 不支持 foreach 内的 foreach ;创建另一个管道,该管道将包含一个 Array 类型的变量,其值作为不同的文件名。 在新管道中,创建一个以变量为输入的 forache 循环,并在 foreach 中创建一个复制活动。

并在foreach活动中的原始管道中(基于日期参数),调用新管道。

【讨论】:

  • 您能详细说明一下吗? for each的参数是什么意思?您是指将childitems 传递给For Eachget meta data,所以它应该将日期作为参数传递给for-each 活动而不是childitems
  • @MaryamAl-Mansour ,为了澄清要求,每天在源位置会有 6 个文件:Vendors-01、Transactions01、Orders01、Customers01、purchase01、history01 并附加相应的日期?
  • @MaryamAl-Mansour,我已经用不同的场景更新了我的答案。主要的变化因素是日期,并且可能存在作业在周末和星期一失败的情况,您需要连续 3 天执行作业。所以 Foreach 应该基于您需要复制文件的日期而不是文件名:)
【解决方案2】:

也许你可以试试这个:使用通配符路径将文件从 Blob 存储复制到 Azure SQL 中的相应表。

我的测试:

  1. 创建一个变量,它的类型是数组,值是你的表名。

2.循环这个数组

3.使用通配符路径过滤文件名

4.pass @item() 到数据集作为接收器

【讨论】:

    猜你喜欢
    • 2020-09-15
    • 2022-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 2022-01-12
    • 1970-01-01
    相关资源
    最近更新 更多