Compartilhar via

在 Azure Data Factory 中使用参数、表达式和函数

适用于: Azure Data Factory Azure Synapse Analytics

本文重点介绍有助于在Azure Data Factory中创建参数化数据管道的基本概念和示例。 参数化和动态表达式为 ADF 增添了灵活性,并且可以通过允许更灵活的提取、转换、加载(ETL)或提取、加载、转换(ELT)解决方案来节省时间。 这些功能可降低解决方案维护成本,并加快将新功能实现到现有管道中。 参数化可最大程度地减少硬编码,并增加解决方案中可重用的对象和进程数。

Azure Data Factory UI 和参数

可以在管道、数据集和数据流的Azure Data Factory用户界面(UI)中找到参数创建和分配。

  1. Azure Data Factory studio 中,转到 Authoring Canvas并编辑管道、数据集或数据流。

  2. 选择空白画布以显示管道设置。 请勿选择任何活动。 可能需要从画布底部拉取设置窗格,因为它可能已折叠。

  3. 选择“ 参数 ”选项卡,然后选择“ + 新建 ”以添加参数。

    显示管道设置的屏幕截图,其中显示了如何在管道中定义参数。

还可以通过在要参数化的属性旁边选择 “添加动态内容” ,在链接服务中使用参数。

显示相关服务中完全限定域名框下动态内容链接的屏幕截图。

突出显示动态内容框和用于创建新参数的+按钮的屏幕截图。

参数概念

可使用参数将外部值传递到管道、数据集、链接服务和数据流。 例如,如果数据集访问Azure Blob Storage中的文件夹,则可以参数化文件夹路径,以便每次运行管道时,可以重复使用同一数据集来访问不同的文件夹。

参数类似于变量,但不同之处在于参数是外部的,因此 传入 管道、数据集、链接服务和数据流,而变量则 在管道中进行定义和使用 。 参数是只读的,而变量可以使用“设置变量”活动在管道中修改。

可以单独使用参数,也可以用作表达式的一部分。 参数的值可以是文本值,也可以是运行时计算的表达式。

例如:

"name": "value"

"name": "@pipeline().parameters.password"

具有参数的表达式

表达式用于在管道、数据集、链接服务或数据流定义的各个部分构造动态值。 表达式始终以@符号开头,后跟括在圆括号中的表达式主体。 例如,以下表达式使用 concat 函数合并两个字符串:

@concat('Hello, ', 'World!')

在表达式中引用参数时,请使用以下语法:

@pipeline().parameters.parameterName

@dataset().parameters.parameterName

可以在 表达式语言概述 文章中了解有关表达式的详细信息,但下面是在表达式中使用参数的一些示例。

复杂表达式示例

以下示例引用活动输出的深层子字段。 若要引用计算结果为子字段的管道参数,请使用 [] 语法而不是 dot(.) 运算符(如子字段 1 和子字段 2 的情况)。

@activity('*activityName*').output.*subfield1*.*subfield2*[pipeline().parameters.*subfield3*].*subfield4*

动态内容编辑器

完成编辑后,动态内容编辑器会自动转义内容中的字符。 例如,内容编辑器中的以下内容是包含两个表达式函数的字符串内插。

{ 
  "type": "@{if(equals(1, 2), 'Blob', 'Table' )}",
  "name": "@{toUpper('myData')}"
}

动态内容编辑器将上述内容转换为表达式 "{ \n \"type\": \"@{if(equals(1, 2), 'Blob', 'Table' )}\",\n \"name\": \"@{toUpper('myData')}\"\n}"。 此表达式的结果是 JSON 格式字符串,如下所示。

{
  "type": "Table",
  "name": "MYDATA"
}

带有参数的数据集

在以下示例中,BlobDataset 采用名为 path 的参数。 其值使用表达式为 folderPath 属性设置一个值: dataset().path

{
    "name": "BlobDataset",
    "properties": {
        "type": "AzureBlob",
        "typeProperties": {
            "folderPath": "@dataset().path"
        },
        "linkedServiceName": {
            "referenceName": "AzureStorageLinkedService",
            "type": "LinkedServiceReference"
        },
        "parameters": {
            "path": {
                "type": "String"
            }
        }
    }
}

包含参数的管道

在以下示例中,管道采用 inputPathoutputPath 参数。 参数化 Blob 数据集 的路径 是使用这些参数的值设置的。 此处使用的语法是:pipeline().parameters.parametername

{
    "name": "Adfv2QuickStartPipeline",
    "properties": {
        "activities": [
            {
                "name": "CopyFromBlobToBlob",
                "type": "Copy",
                "inputs": [
                    {
                        "referenceName": "BlobDataset",
                        "parameters": {
                            "path": "@pipeline().parameters.inputPath"
                        },
                        "type": "DatasetReference"
                    }
                ],
                "outputs": [
                    {
                        "referenceName": "BlobDataset",
                        "parameters": {
                            "path": "@pipeline().parameters.outputPath"
                        },
                        "type": "DatasetReference"
                    }
                ],
                "typeProperties": {
                    "source": {
                        "type": "BlobSource"
                    },
                    "sink": {
                        "type": "BlobSink"
                    }
                }
            }
        ],
        "parameters": {
            "inputPath": {
                "type": "String"
            },
            "outputPath": {
                "type": "String"
            }
        }
    }
}

练习的详细示例

使用 Azure Data Factory 和参数的复制管道

Azure Data Factory复制管道参数传递教程将指导你了解如何在管道和活动之间以及活动之间传递参数。

使用参数映射数据流管道

请参阅使用参数映射数据流指南,以获取在数据流中使用参数的全面示例。

带参数的元数据驱动管道

按照 元数据驱动管道和参数 指南,详细了解如何使用参数设计元数据驱动管道。 这是参数的常见用例。

对于可以在表达式中使用的系统变量列表,请参阅系统变量