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


Преобразование в плоскую структуру в потоке данных для сопоставления

Область применения:Фабрика данных Azure Azure Synapse Analytics

Совет

Попробуйте использовать фабрику данных в Microsoft Fabric, решение для аналитики с одним интерфейсом для предприятий. Microsoft Fabric охватывает все, от перемещения данных до обработки и анализа данных в режиме реального времени, бизнес-аналитики и отчетности. Узнайте, как бесплатно запустить новую пробную версию !

Потоки данных доступны в конвейерах как Фабрики данных Azure, так и Azure Synapse. Эта статья относится к потокам данных для сопоставления. Если вы не знакомы с преобразованиями, см. вводную статью Преобразование данных с помощью потока данных для сопоставления.

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

Настройка

Преобразование с плоской содержит следующие параметры конфигурации.

Screenshot that shows flatten settings.

Unroll by (Развернуть по)

Выберите массив, который нужно развернуть. Выходные данные будут содержать по одной строке для каждого элемента в каждом массиве. Если развертываемый массив во входной строке имеет значение NULL или является пустым, будет выведена одна выходная строка с неразвернутыми значениями NULL. Вы можете развернуть несколько массивов для преобразования Flatten. Нажмите кнопку "плюс" (+), чтобы включить несколько массивов в одно преобразование Flatten. Здесь можно использовать метаданные потока данных ADF, включая name и type использовать сопоставление шаблонов для отмены массивов, которые соответствуют этим критериям. При включении нескольких массивов в одно преобразование Flatten результаты будут декартовским продуктом всех возможных значений массива.

Screenshot that shows flatten results.

Unroll root (Корень развертывания)

По умолчанию преобразование в плоскую структуру разворачивает массив в верхнюю часть иерархии, в которой он находится. При необходимости можно выбрать массив в качестве корня развертывания. Корень развертывания должен быть массивом составных объектов, который является развертываемым массивом или содержит его. Если выбран корень развертывания, выходные данные будут содержать по крайней мере одну строку для каждого элемента в корне развертывания. Если входная строка не содержит элементов в корне развертывания, она будет удалена из выходных данных. Выбор корня развертывания всегда приведет к выводу меньшего или равного количества строк в сравнении с поведеним по умолчанию.

Flatten mapping (Сопоставление преобразования в плоскую структуру)

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

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

Rule-based mapping (Выбор преобразования: сопоставление на основе правил)

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

Flatten pattern

Соответствующее условие

Введите условие сопоставления шаблона для столбца или столбцов, для которых необходимо выполнить сведение (с помощью точного сопоставления или шаблонов). Пример: like(name,'cust%')

Углубленный обход столбцов

Необязательный параметр, который указывает службе обрабатывать все подстолбцы сложного объекта по отдельности, а не обрабатывать сложный объект как целый столбец.

Уровень иерархии

Выберите уровень иерархии, которую вы хотите развернуть.

Имя соответствует (регулярному выражению)

При необходимости укажите в этом поле, что сопоставление имени следует выполнять как для регулярного выражения (а не с помощью приведенного выше условия сопоставления).

Примеры

Приведенные ниже примеры преобразования в плоскую структуру основаны на следующем объекте JSON:

{
  "name":"MSFT","location":"Redmond", "satellites": ["Bay Area", "Shanghai"],
  "goods": {
    "trade":true, "customers":["government", "distributer", "retail"],
    "orders":[
        {"orderId":1,"orderTotal":123.34,"shipped":{"orderItems":[{"itemName":"Laptop","itemQty":20},{"itemName":"Charger","itemQty":2}]}},
        {"orderId":2,"orderTotal":323.34,"shipped":{"orderItems":[{"itemName":"Mice","itemQty":2},{"itemName":"Keyboard","itemQty":1}]}}
    ]}}
{"name":"Company1","location":"Seattle", "satellites": ["New York"],
  "goods":{"trade":false, "customers":["store1", "store2"],
  "orders":[
      {"orderId":4,"orderTotal":123.34,"shipped":{"orderItems":[{"itemName":"Laptop","itemQty":20},{"itemName":"Charger","itemQty":3}]}},
      {"orderId":5,"orderTotal":343.24,"shipped":{"orderItems":[{"itemName":"Chair","itemQty":4},{"itemName":"Lamp","itemQty":2}]}}
    ]}}
{"name": "Company2", "location": "Bellevue",
  "goods": {"trade": true, "customers":["Bank"], "orders": [{"orderId": 4, "orderTotal": 123.34}]}}
{"name": "Company3", "location": "Kirkland"}

Массив строк без корня развертывания

Unroll by (Развернуть по) Unroll root (Корень развертывания) Проекция
goods.customers нет Имя
customer = goods.customer

Выходные данные

{ 'MSFT', 'government'}
{ 'MSFT', 'distributer'}
{ 'MSFT', 'retail'}
{ 'Company1', 'store'}
{ 'Company1', 'store2'}
{ 'Company2', 'Bank'}
{ 'Company3', null}

Массив составных объектов без корня развертывания

Unroll by (Развернуть по) Unroll root (Корень развертывания) Проекция
goods.orders.shipped.orderItems нет Имя
orderId = goods.orders.orderId
itemName = goods.orders.shipped.orderItems.itemName
itemQty = goods.orders.shipped.orderItems.itemQty
location = location

Выходные данные

{ 'MSFT', 1, 'Laptop', 20, 'Redmond'}
{ 'MSFT', 1, 'Charger', 2, 'Redmond'}
{ 'MSFT', 2, 'Mice', 2, 'Redmond'}
{ 'MSFT', 2, 'Keyboard', 1, 'Redmond'}
{ 'Company1', 4, 'Laptop', 20, 'Seattle'}
{ 'Company1', 4, 'Charger', 3, 'Seattle'}
{ 'Company1', 5, 'Chair', 4, 'Seattle'}
{ 'Company1', 5, 'Lamp', 2, 'Seattle'}
{ 'Company2', 4, null, null, 'Bellevue'}
{ 'Company3', null, null, null, 'Kirkland'}

Тот же корень, что и развертываемый массив

Unroll by (Развернуть по) Unroll root (Корень развертывания) Проекция
goods.orders goods.orders Имя
goods.orders.shipped.orderItems.itemName
goods.customers
Расположение

Выходные данные

{ 'MSFT', ['Laptop','Charger'], ['government','distributer','retail'], 'Redmond'}
{ 'MSFT', ['Mice', 'Keyboard'], ['government','distributer','retail'], 'Redmond'}
{ 'Company1', ['Laptop','Charger'], ['store', 'store2'], 'Seattle'}
{ 'Company1', ['Chair', 'Lamp'], ['store', 'store2'], 'Seattle'}
{ 'Company2', null, ['Bank'], 'Bellevue'}

Массив составных объектов с корнем развертывания

Unroll by (Развернуть по) Unroll root (Корень развертывания) Проекция
goods.orders.shipped.orderItem goods.orders Имя
orderId = goods.orders.orderId
itemName = goods.orders.shipped.orderItems.itemName
itemQty = goods.orders.shipped.orderItems.itemQty
location = location

Выходные данные

{ 'MSFT', 1, 'Laptop', 20, 'Redmond'}
{ 'MSFT', 1, 'Charger', 2, 'Redmond'}
{ 'MSFT', 2, 'Mice', 2, 'Redmond'}
{ 'MSFT', 2, 'Keyboard', 1, 'Redmond'}
{ 'Company1', 4, 'Laptop', 20, 'Seattle'}
{ 'Company1', 4, 'Charger', 3, 'Seattle'}
{ 'Company1', 5, 'Chair', 4, 'Seattle'}
{ 'Company1', 5, 'Lamp', 2, 'Seattle'}
{ 'Company2', 4, null, null, 'Bellevue'}

Скрипт потока данных

Синтаксис

<incomingStream>
foldDown(unroll(<unroll cols>),
    mapColumn(
        name,
        each(<array>(type == '<arrayDataType>')),
        each(<array>, match(true())),
        location
    )) ~> <transformationName>

Пример

source foldDown(unroll(goods.orders.shipped.orderItems, goods.orders),
    mapColumn(
        name,
        orderId = goods.orders.orderId,
        itemName = goods.orders.shipped.orderItems.itemName,
        itemQty = goods.orders.shipped.orderItems.itemQty,
        location = location
    ),
    skipDuplicateMapInputs: false,
    skipDuplicateMapOutputs: false)