参数化数据流 Gen2

Fabric Dataflow Gen2 中的参数允许你定义可重用输入,这些输入可塑造数据流的设计方式,并且借助 公共参数模式 ,这些输入可以通过管道或 API 在运行时设置。 它使单个数据流具有高度灵活性和通用性,因为只需传递不同的值,即可在多个方案中重复使用相同的逻辑,从而启用动态自动化工作流,而无需重写或复制转换。

本教程将引导你通过一个示例,向你展示如何:

  • 参数化源:将 Lakehouse 与 WideWorldImporters 示例数据集一起用作源
  • 参数化逻辑:使用贯穿整个数据流体验中可用的输入控件
  • 参数化目标:将仓库用作目标
  • 使用参数值提交运行请求:通过 Fabric 管道内的数据流活动体验传递参数值

数据流 Gen2 中参数化数据流解决方案体系结构的关系图。

注释

本文中展示的概念对于 Dataflow Gen2 是通用的,并且还适用于除此处所示以外的其他源和目标。

情景

Dataflow Gen2 中场景内名为dimension_city的查询的屏幕截图。

此方案中使用的数据流很简单,但描述的核心原则适用于所有类型的数据流。 它从存储在 Lakehouse 中的 Wide World Importers 示例数据集连接到名为dimension_city的表。 它会筛选 SalesTerritory 列等于 "Southeast" 的行,并将结果加载到仓库中的一个名为 City 的新表中。 所有组件(Lakehouse、Warehouse 和数据流)都位于同一工作区中。 若要使数据流动态,请参数化源表、筛选器值和目标表。 这些更改允许数据流使用特定值而不是硬编码的值运行。

在继续之前,请通过转到“开始”选项卡,选择“选项”,在“参数”部分中勾选“启用参数以供发现和重写执行”的复选框,并允许数据流在执行期间接受参数,从而启用公共参数模式。

Dataflow Gen2 中选项对话框的屏幕截图,其中“参数”部分显示了“启用以发现并替代执行”设置。

参数化源

使用任何 Fabric 连接器(如 Lakehouse、Warehouse 或 Fabric SQL)时,它们都遵循相同的导航结构并使用相同的输入格式。 在此方案中,任何连接器都不需要手动输入才能建立连接。 但是,每个工作区都显示它通过查询中的导航步骤连接到的工作区和项。 例如,第一个导航步骤包括查询连接到的 workspaceId。

导航 1 步骤的屏幕截图,其中dimension_city查询的编辑栏中的 workspaceId 值。

目标是将编辑栏中的硬编码值替换为参数。 具体而言,需要为 WorkspaceId 创建一个参数,另一个参数用于 LakehouseId。 若要创建参数,请转到功能区中的 “开始 ”选项卡,选择“ 管理参数”,然后从下拉菜单中选择 “新建参数 ”。

“开始”选项卡中用于创建新参数的条目的屏幕截图。

创建参数时,请确保两者都标记为 必需 ,并设置为 文本 类型。 对于当前值,请使用与特定环境中的相应值匹配的值。

在“管理参数”对话框中创建的 LakehouseId 参数的屏幕截图。

创建这两个参数后,可以更新查询脚本以使用它们,而不是硬编码的值。 这涉及到将公式栏中的原始值手动替换为对工作区 ID 和 Lakehouse ID 参数的引用。 原始查询脚本如下所示:

let
  Source = Lakehouse.Contents([]),
  #"Navigation 1" = Source{[workspaceId = "8b325b2b-ad69-4103-93ae-d6880d9f87c6"]}[Data],
  #"Navigation 2" = #"Navigation 1"{[lakehouseId = "2455f240-7345-4c8b-8524-c1abbf107d07"]}[Data],
  #"Navigation 3" = #"Navigation 2"{[Id = "dimension_city", ItemKind = "Table"]}[Data],
  #"Filtered rows" = Table.SelectRows(#"Navigation 3", each ([SalesTerritory] = "Southeast")),
  #"Removed columns" = Table.RemoveColumns(#"Filtered rows", {"ValidFrom", "ValidTo", "LineageKey"})
in
  #"Removed columns"

更新导航步骤中的引用后,新的更新脚本可能如下所示:

let
  Source = Lakehouse.Contents([]),
  #"Navigation 1" = Source{[workspaceId = WorkspaceId]}[Data],
  #"Navigation 2" = #"Navigation 1"{[lakehouseId = LakehouseId]}[Data],
  #"Navigation 3" = #"Navigation 2"{[Id = "dimension_city", ItemKind = "Table"]}[Data],
  #"Filtered rows" = Table.SelectRows(#"Navigation 3", each ([SalesTerritory] = "Southeast")),
  #"Removed columns" = Table.RemoveColumns(#"Filtered rows", {"ValidFrom", "ValidTo", "LineageKey"})
in
  #"Removed columns"

你会注意到,在数据流编辑器中,它仍然正确显示数据预览。

参数化逻辑

现在源正在使用参数,接下来可以专注于参数化数据流的转换逻辑。 在此情境中,筛选器步骤是应用逻辑的地方,应该将目前已硬编码为东南的值替换为参数。 为此,请创建一个名为 Territory 的新参数,将其数据类型设置为 文本,将其 标记为不需要,并将其当前值设置为 Mideast

在“管理参数”对话框中创建的 Territory 参数的屏幕截图。

鉴于筛选步骤是使用用户界面创建的,可以转到过滤行步骤,双击它以获取筛选步骤的设置对话框。 您可以通过输入小组件在此对话框中选择是否要使用参数而不是静态值。

筛选行对话框中输入小组件的屏幕截图,其中包含用于引用参数的选项。

选择“ 选择参数”选项后,下拉列表将显示与所需数据类型匹配的所有可用参数。 在此列表中,可以选择新建的 Territory 参数。

从“筛选器行”对话框的输入小组件中选择的“Territory”参数的屏幕截图。

选择“确定”后,请注意,关系图视图已经创建了新创建的参数与正在使用的查询之间的链接。 不仅这样,数据预览现在还显示 中东 地区的信息。

dimension_city查询的图表视图、查询设置和数据预览的屏幕截图,显示 Mideast SalesTerritory 的数据。

参数化目标

注释

建议熟悉数据流 Gen2 中的数据目标的概念,以及如何从有关数据目标和托管设置的文章中创建其混合脚本

在此方案中参数化的最后一个组件是目标。 虽然可以在数据流编辑器中找到有关数据目标的信息,但若要参数化数据流的此部分,需要使用 Git 或 REST API。

显示dimension_city查询的数据目标设置的弹出窗口的屏幕截图。

本教程介绍如何通过 Git 进行更改。 在通过 git 进行更改之前,请确保:

  • 创建一个名为 WarehouseId 的参数:确保使用仓库的相应 ID 作为当前值,设置为必填项并使用文本数据类型。
  • 保存数据流:使用功能区主选项卡中的“保存”按钮。

数据流保存按钮的屏幕截图。

保存数据流后,请确保将更改提交到 Git 存储库,然后前往存储库,查看数据流的 mashup.pq 文件。 查看 mashup.pq 文件时,查找与数据目标关联的查询。 在此情境中,该查询的名称为dimension_city。 此时会看到此查询名称上方的记录属性:

[DataDestinations = {[Definition = [Kind = "Reference", QueryName = "dimension_city_DataDestination", IsNewTarget = true], Settings = [Kind = "Manual", AllowCreation = true, ColumnSettings = [Mappings = {[SourceColumnName = "CityKey", DestinationColumnName = "CityKey"], [SourceColumnName = "WWICityID", DestinationColumnName = "WWICityID"], [SourceColumnName = "City", DestinationColumnName = "City"], [SourceColumnName = "StateProvince", DestinationColumnName = "StateProvince"], [SourceColumnName = "Country", DestinationColumnName = "Country"], [SourceColumnName = "Continent", DestinationColumnName = "Continent"], [SourceColumnName = "SalesTerritory", DestinationColumnName = "SalesTerritory"], [SourceColumnName = "Region", DestinationColumnName = "Region"], [SourceColumnName = "Subregion", DestinationColumnName = "Subregion"], [SourceColumnName = "Location", DestinationColumnName = "Location"], [SourceColumnName = "LatestRecordedPopulation", DestinationColumnName = "LatestRecordedPopulation"]}], DynamicSchema = false, UpdateMethod = [Kind = "Replace"], TypeSettings = [Kind = "Table"]]]}]
shared dimension_city = let

此属性记录具有名为 QueryName 的字段,该字段包含具有与此查询关联的所有数据目标逻辑的查询的名称。 此查询如下所示:

shared dimension_city_DataDestination = let
  Pattern = Fabric.Warehouse([HierarchicalNavigation = null, CreateNavigationProperties = false]),
  Navigation_1 = Pattern{[workspaceId = "8b325b2b-ad69-4103-93ae-d6880d9f87c6"]}[Data],
  Navigation_2 = Navigation_1{[warehouseId = "527ba9c1-4077-433f-a491-9ef370e9230a"]}[Data],
  TableNavigation = Navigation_2{[Item = "City", Schema = "dbo"]}?[Data]?
in
  TableNavigation

你注意到,与 Lakehouse 源脚本相似,目标脚本展示了类似的模式,其中硬编码了需要使用的 WorkspaceId 和 WarehouseId。 将这些固定值替换为参数的标识符,脚本应如下所示:

shared dimension_city_DataDestination = let
  Pattern = Fabric.Warehouse([HierarchicalNavigation = null, CreateNavigationProperties = false]),
  Navigation_1 = Pattern{[workspaceId = WorkspaceId]}[Data],
  Navigation_2 = Navigation_1{[warehouseId = WarehouseId]}[Data],
  TableNavigation = Navigation_2{[Item = "City", Schema = "dbo"]}?[Data]?
in
  TableNavigation

现在,可以使用数据流中的更改通过工作区中的源代码管理功能提交此更改并更新数据流。 可以通过打开数据流并查看数据目标以及添加的任何以前的参数引用来验证所有更改是否已到位。 这将完成数据流的所有参数化,现在可以通过传递参数值来运行数据流。

使用参数值运行请求

可以使用 Fabric REST API 发送包含该特定运行作的参数值的自定义有效负载的运行请求,还可以使用 REST API 发现数据流参数 并了解数据流所需的内容,以便触发运行。 在本教程中,你将使用在 Fabric 管道的数据流活动中找到的体验。 首先创建管道并将新的 数据流活动 添加到画布。 在活动的设置中,找到数据流所在的工作区,然后从下拉列表中选择数据流。

数据流活动的屏幕截图,其中包含管道中的参数。

可以展开数据流参数部分以显示数据流中的所有可用参数及其默认值。 可以替换此处的任何值,传递的值将用于定义应使用哪些源、逻辑和目标来评估数据流运行。 您还可以尝试新方案,方法是创建新仓库并更改用于评估的 WarehouseId,或者在需要传递 WorkspaceId 和其他参数以指向相应环境中的正确项的部署管道中使用此模式。