【问题标题】:Azure Data Factory get data for "For Each"component from queryAzure 数据工厂从查询中获取“For Each”组件的数据
【发布时间】:2018-07-31 08:18:12
【问题描述】:

情况如下:我的数据库中有一个表,每天接收大约 300 万行。我们希望定期归档此表,以便表中只有最近的 8 周。其余数据可以存档到 AZure 数据湖。 我已经一天一天地发现了如何做到这一点。但现在我想在表格的前 7 天每周运行这个管道。我认为我应该使用“For Each”组件来做到这一点。它应该沿着我要备份的数据集中存在的七个不同日期进行迭代。该数据集从源表复制到正手存档表。 使用 SQL 查询获取不同的日期并不难,但是如何将此查询的结果放入用于“For Each”组件的数组中?

【问题讨论】:

    标签: foreach parameters azure-data-factory


    【解决方案1】:

    你可以使用lookup activity来获取列内容,输出会是这样的

    {
    "count": "2",
    "value": [
        {
            "Id": "1",
            "TableName" : "Table1"
        },
        {
            "Id": "2",
            "TableName" : "Table2"
        }
    ]
    }
    

    然后您可以使用@activity('MyLookupActivity').output.value 的模式将值数组传递给Foreach 活动项字段

    参考文档:Use the Lookup activity result in a subsequent activity

    【讨论】:

    • 好的,非常清楚。文档指出我可以使用@activity('MyLookupActivity').output.value[ZeroBasedIndex].propertyname 访问数组中的元素。因此,如果我使用上面的示例并且我想遍历表名,我假设我需要在 For Each 循环的设置框中:@activity('MyLookupActivity').output.value[0].TableName 但是做什么我在 For Each 循环内的复制活动源中的查询中使用?只是@activity('MyLookupActivity').output.value?或@activity('MyLookupActivity').output.value.TableName
    • 既然你从一个表复制到另一个,我想你可以先按日期过滤行,然后获取过滤行的id(或其他键列)。然后,对于 foreach 活动的 字段,输入 @activity('MyLookupActivity').output.value(这将是一个数组)。接下来,对于内部复制活动,源的查询字段将类似于“select * from where id == @item().id”
    • 感谢。我现在可以工作了。更多说明可以在 youtube 上找到:youtube.com/watch?v=ROq5mVrZPY0
    • 似乎我对“我现在可以使用它”有点过早。 for each 组件有效,但在 For Each 组件的复制活动中为 Sink 站点分配文件名时遇到问题。当我说文件名应该是@item().Date 时,ADF 会发出警告:“item”不是可识别的函数。但是,在源站点上,我使用 @item().Date 作为存储过程的参数,并且该部分有效。当我说文件名应该是@concat('Data',@item().Date'.txt')。它给出了一个错误:无法识别的表达式。
    • 您可以在数据集面板上声明一个参数,并在复制活动面板中设置它的值。参考文档:docs.microsoft.com/en-us/azure/data-factory/…
    【解决方案2】:

    多亏了一位同事,问题才得以解决。 我们要做的就是为 sink 的数据集分配一个参数。不管你如何命名它,你不必给它赋值。但是让我们假设这个参数被称为“日期” 之后,您可以使用“@dataset().Date”在接收器的文件名(也在数据集中)中使用此参数。 之后,您返回复制活动并在接收器中将数据集属性分配给@item().DateSelect。 (DateSelect 是传递给 For Each 活动的数组中的字段名称)

    另请参阅Bo Xioa的答案作为答案的一部分

    这样可以完美运行。可惜没有很好的记录

    【讨论】:

      【解决方案3】:

      我将此作为答案发布,因为该错误不适合评论:D

      已经看到了实现此目的的另一种选择。那是通过从另一个管道执行管道。通过这种方式,我可以将应该迭代的日期定义为第二个管道中的参数 (docs.microsoft.com/en-us/azure/data-factory/...)。但不幸的是,这会导致与仅使用 foreach 参数时相同的结果。因为在我的数据湖文件的文件名中我必须使用:@{item().columname}。我可以在监控视图中看到在迭代步骤中传递了正确的值,但我不断收到错误:

      { “错误代码”:“2200”, "message": "'Sink' 端发生故障。ErrorCode=UserErrorFailedFileOperation,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=对 'Unknown' 的请求失败,状态码为 'BadRequest',请求 id是 ''。{\"error\":{\"code\":\"BadRequest\",\"message\":\"从客户端 (:) 检测到潜在危险的 Request.Path 值。跟踪:cf3b4c3f-1681-4073-b225-17e1c07ec76d 时间:2018-08-02T05:16:13.2141897-07:00\"}} ,Source=Microsoft.DataTransfer.ClientLibrary,''Type=System.Net.WebException,Message =远程服务器返回错误:(400) Bad Request.,Source=System,'", "failureType": "用户错误", “目标”:“复制舞者数据到 ADL” }

      【讨论】:

        猜你喜欢
        • 2020-09-15
        • 1970-01-01
        • 2020-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-05
        相关资源
        最近更新 更多