Поделиться через


Ссылки на переменные в потоке данных

Замечание

В этой статье рассматривается архитектура решения из архитектуры решений CI/CD и ALM (управление жизненным циклом приложений) для потока данных 2-го поколения, которая зависит от интеграции библиотек переменных и применяется только к потоку данных 2-го поколения с поддержкой CI/CD.

Библиотеки переменных Fabric в Dataflow 2-го поколения позволяют централизованно и повторно использовать управление конфигурацией в различных средах. Ссылаясь на переменные непосредственно в скриптах потока данных, вы можете динамически настраивать поведение без жесткого ввода значений, что идеально подходит для рабочих процессов CI/CD. Эта интеграция упрощает развертывание на разных этапах, позволяя на этапе выполнения использовать значения, специфичные для рабочей области (например, идентификаторы Lakehouse или рабочей области), что обеспечивает большую адаптируемость и удобство поддержки потоков данных.

В этом руководстве описывается пример решения, использующего переменные ссылки в потоке данных, и показано, как:

  • Установка переменных: использование библиотек переменных Fabric и их различных типов данных
  • Источник, управляемый переменной: использование Lakehouse с примером набора данных WideWorldImpoters в качестве источника
  • Логика на основе переменных: использование входных мини-приложений, доступных во всем интерфейсе потока данных
  • Назначение, управляемое переменной: использование хранилища в качестве назначения

Схема архитектуры решения, использующая ссылки на переменные в Dataflow 2-го поколения.

Замечание

Основные понятия, представленные в этой статье, являются универсальными для потока данных 2-го поколения и применимы к другим источникам и назначениям за пределами указанных здесь.

Сценарий

Снимок экрана: запрос с именем dimension_city для сценария внутри Dataflow Gen2.

Поток данных, используемый в этом сценарии, прост, но основные принципы, описанные в этом сценарии, применяются ко всем типам потоков данных. Он подключается к таблице с именем dimension_city из примера набора данных Wide World Importers, хранящегося в Lakehouse. Он фильтрует строки, где столбец SalesTerritory равен юго-востоку, и загружает результат в новую таблицу с именем City в хранилище. Все компоненты — Lakehouse, Warehouse и Dataflow — находятся в одной рабочей области. Для динамического потока данных используются переменные для управления исходной таблицей, значением фильтра и целевой таблицей. Эти изменения позволяют потоку данных выполняться со значениями, хранящимися в библиотеках переменных Fabric, а не жестко закодированных.

Установка переменных

Замечание

Обязательно включите библиотеки переменных Fabric для вашей организации или группы безопасности. Узнайте больше о начале работы с библиотеками переменных.

Рекомендуется всегда иметь в виду дизайн перед созданием решения и определение, какие компоненты из вашего потока данных динамически извлекаются из библиотеки переменных. Хотя вы можете создать несколько библиотек в рабочей области, в этом примере используется одна библиотека с именем My Library , которая содержит переменные, которые использует поток данных 2-го поколения:

Имя переменной Тип Цель
WorkspaceId Гид Используется для сценариев источника данных и назначения в потоке данных
LakehouseId Гид Определяет идентификатор лейкхауса, используемого в качестве источника
WarehouseId Гид Определяет идентификатор хранилища, используемого в качестве назначения
Территория String Задает значение, которое следует использовать для управления логикой фильтра в потоке данных.

Обязательно задайте значения по умолчанию, соответствующие собственной среде, а затем сохраните библиотеку переменных.

Снимок экрана: только что созданные библиотеки переменных Fabric с переменными WorkspaceId, LakehouseId, WarehouseId и Territory.

Источник, управляемый переменной

При использовании любого соединителя Fabric , например Lakehouse, Warehouse или Fabric SQL, они все следуют одной структуре навигации и используют один и тот же формат входных данных. В этом сценарии ни один из соединителей не требует ручного ввода для установления подключения. Однако каждый из них показывает, к какой рабочей области и элементу он подключается с помощью шагов навигации в запросе. Например, первый шаг навигации включает идентификатор рабочей области, к которому подключается запрос.

Снимок экрана: шаг навигации 1 со значением workspaceId в строке формул для запроса dimension_city.

Цель состоит в том, чтобы заменить жестко закодированные значения в строке формул переменными. В частности, вы хотите использовать переменные WorkspaceId и LakehouseId для выполнения этой логики. Сначала необходимо перенести эти переменные в поток данных 2-го поколения. Рекомендуемый подход — создать запросы для каждой отдельной переменной для централизованного управления любыми переменными, которые планируется использовать. Для этого создайте пустой запрос, перейдя в запись "Получить данные " на ленте и выбрав параметр "Пустой запрос" в раскрывающемся меню.

Снимок экрана пункта 'Получение данных' на вкладке 'Главная' для создания пустого запроса.

При выборе этого параметра откроется новое диалоговое окно, в котором можно увидеть пустой запрос, созданный. Чтобы принести новый пустой запрос, нажмите кнопку "ОК".

Снимок экрана: пустое диалоговое окно запроса.

После создания и отображения запроса в потоке данных переименуйте его в WorkspaceId и замените формулу на шаге "Источник":

Variable.ValueOrDefault("$(/**/My Library/WorkspaceId)", "Your Workspace ID")

Этот скрипт в основном является тем, который может определить, какую библиотеку и переменную следует получить. Второй аргумент Variable.ValueOrDefault функции определяет, какое значение следует указать, когда переменная не может быть возвращена.

Замечание

Обязательно замените строку "Ваш идентификатор рабочей области", второй аргумент функции с соответствующим значением в вашей среде и сохраните запрос.

Повторите этот процесс для переменной LakehouseId и создайте запрос с тем же именем, что и переменная, но используйте следующую формулу для шага Source:

Variable.ValueOrDefault("$(/**/My Library/LakehouseId)", "Your Lakehouse ID")

Замечание

Обязательно замените строку "Your Lakehouse ID", которая является вторым аргументом функции, соответствующим значением в вашей среде и сохраните запрос.

Снимок экрана: только что созданные запросы с именем LakehouseId и WorkspaceId.

После создания обоих запросов можно обновить скрипт запроса, чтобы использовать их вместо жестко закодированных значений. Это включает в себя ручное замена исходных значений в строке формул на ссылки на запросы WorkspaceId и LakehouseId. Исходный скрипт запроса выглядит следующим образом:

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"

И вы заметили, что он всё ещё правильно оценивает предварительный просмотр данных в редакторе потока данных с прямыми ссылками, созданными в режиме диаграммы между всеми участвующими запросами.

Снимок экрана: запросы WorkspaceId и LakehouseId, на которые ссылается запрос dimension_city.

Логика на основе переменных

Теперь, когда источник использует переменные, можно сосредоточиться на изменении логики преобразования потока данных. В этом сценарии шаг фильтра заключается в том, где применяется логика, а значение, отфильтрованное в настоящее время жестко закодированное как юго-восток, должно быть заменено запросом, ссылающимся на переменную. Для этого необходимо повторить тот же процесс создания пустого запроса и перепрофилировать формулу его шага "Источник", чтобы сохранить переменную для территории и изменить имя запроса на имя переменной. Используйте следующий скрипт:

Variable.ValueOrDefault("$(/**/My Library/Territory)", "Mideast")

Снимок экрана: запрос

Учитывая, что шаг фильтра был создан с помощью пользовательского интерфейса, вы можете переходить к шагу "Отфильтрованные строки", дважды выберите его и получите диалоговое окно параметров для шага фильтра. Это диалоговое окно позволяет вам выбрать, с помощью виджета ввода, хотите ли вы использовать запрос вместо статического значения:

Снимок экрана виджета ввода в диалоговом окне

После выбора параметра "Выбрать запрос" появится раскрывающийся список для отображения всех запросов, которые можно выбрать. В этом списке можно выбрать только что созданный запрос территории .

Снимок экрана: запрос

После нажатия кнопки "ОК" обратите внимание, что представление схемы уже создало связь между запросом "Территория" и используемым запросом. Не только это, но и предварительная версия данных теперь показывает сведения о территории Mideast .

Снимок экрана: представление диаграммы, параметры запроса и предварительный просмотр данных для запроса dimension_city с данными для Mideast SalesTerritory.

Переменно управляемое назначение

Замечание

Рекомендуется ознакомиться с понятием назначения данных в Dataflow 2-го поколения и как его скрипт mashup создается из статьи о назначениях данных и управляемых параметрах.

Последним компонентом для изменения в этом сценарии является назначение. Хотя сведения о назначении данных можно найти в редакторе потока данных, чтобы изменить эту часть потока данных, необходимо использовать Git или REST API.

Снимок экрана: всплывающий элемент, содержащий параметры назначения данных для запроса dimension_city.

В этом руководстве показано, как внести изменения с помощью Git. Прежде чем вносить изменения с помощью Git, обязательно выполните следующие действия.

  • Создайте запрос для переменной WarehouseId: выполните тот же процесс, который описан в предыдущих разделах, чтобы создать пустой запрос и заменить формулу для шага source:
Variable.ValueOrDefault("$(/**/My Library/WarehouseId)", "Your Warehouse ID")

Замечание

Обязательно замените строку "Идентификатор хранилища", второй аргумент функции с соответствующим значением в вашей среде и сохраните запрос.

Снимок экрана: все запросы в потоке данных, включая только что созданный запрос WarehouseId.

Это важно

Убедитесь, что во всех запросах, содержащих переменные, отключена промежуточная стадия. Снимок экрана с параметрами настройки запроса в контекстном меню.

  • Сохраните поток данных: нажмите кнопку "Сохранить" на домашней вкладке ленты.

Снимок экрана: кнопка сохранения потока данных.

После сохранения потока данных обязательно зафиксируйте изменения в репозитории 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, этот сценарий для назначения имеет аналогичный шаблон, в котором он жестко кодирует идентификатор рабочей области, который необходимо использовать, а также 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

Теперь вы можете зафиксировать это изменение и обновить ваш поток данных, используя изменения через функцию управления версиями в вашей рабочей области.

Теперь вы можете запустить поток данных, который использует значения из библиотек переменных.