【问题标题】:Passing parameters to copy activity using filter activity使用过滤器活动传递参数以复制活动
【发布时间】:2022-01-22 04:57:46
【问题描述】:

我通过获取元数据活动获得文件夹中的文件列表,然后在过滤活动的帮助下对文件进行整理。现在我想将这些文件的名称传递给复制活动。

这是过滤器活动的输出(只有一个文件,因为每个活动都在其中。):

{
    "ItemsCount": 2,
    "FilteredItemsCount": 1,
    "Value": [
        {
            "name": "part-00000-622d6021-26bc-4ad5-9e4c-0d80cec7c6b7-c000.csv",
            "type": "File"
        }
    ]
}

如何将名称传递给源端的复制活动?

比如我已经试过了:@activity('Filter1_copy1').output.value - @activity('Filter1_copy1').output.value[0]

我尝试过的一切都会导致我出错:

ErrorCode=UserErrorInvalidValueInPayload,'Type=Microsoft.DataTransfer.Common.Shared.HybridDelivery
Exception,Message=Failed to convert the value in 'fileName' property to 'System.String' type. 
Please make sure the payload structure and value are correct.,Source=Microsoft.DataTransfer.DataContracts,
''Type=System.InvalidCastException,Message=Object must implement IConvertible.,Source=mscorlib,'

【问题讨论】:

  • 如果您的 ForEach 正在循环过滤器的结果,请使用 @item().name 获取当前迭代的文件名。

标签: azure azure-data-factory azure-data-factory-2


【解决方案1】:

Azure 数据工厂 (ADF) 表达式语言不是世界上最直观的东西,但有一个强大的中心元素,它实际上只是 JSONPath 的(一个子集),就像 XPath 一样,是一种询问复杂 JSON 的简单语言对象。这使用点语法来访问属性(例如parent.child)和数组语法来访问数组Value[0].name

Filter 活动(如 Get Metadata 活动)返回一段复杂的 JSON,它是活动的结果,表示为一个对象。

在您的特定示例中,您有一个带有 Value 数组的对象,该数组可以包含零个或多个项目。请记住,数组在 JSONPath 中是从零开始的。因此,为了访问这个数组的第一个值,我们需要使用一个从零开始的位置指示符,称为序数 ([0]),并使用点语法来获取属性,例如 name

@activity('Filter1').output.Value[0].name

记住大小写在 JSON 和 JSONPath 中很重要,因此数组是 Value(大写 V)。根据需要修改 ADF 活动名称(例如,在我的示例中使用 Filter1_copy 而不是 Filter1,但我建议您查看命名约定:)

只是为了好玩,我使用jsonpath.com 来练习这些表达式,而不必每次都运行并重新运行管道以查看它是否有效。它可以让你在正确的地方。经过一些练习,您将能够查看您的活动输出并确定表达式应该是什么。一个简单的例子:

我认为 ADF 不支持完整的 JSONPath 语法,但我只是粘贴了您的示例 JSON,并编写了 Values[0].name 位进行测试。

【讨论】:

  • 想知道我是否应该编辑这个并将tl:dr和答案放在顶部,然后是其余部分:)
猜你喜欢
  • 2021-10-16
  • 2014-10-30
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多