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

ПРИМЕНИМО К: Фабрика данных Azure Azure Synapse Analytics

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

Совет

Эквивалентное преобразование (развернуть столбец) в Dataflow 2-го поколения см. в руководстве по потоку данных 2-го поколения для сопоставления пользователей потока данных.

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

Настройка

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

Снимок экрана, на котором показаны параметры выравнивания.

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

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

Снимок экрана, на котором показаны плоские результаты.

Развёртывание корня

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

Flatten mapping (Приведение сопоставления к плоской структуре)

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

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

Сопоставление на основе правил

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

Шаблон плоской структуры

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

Введите условие сопоставления шаблона для столбца или столбцов, которые вы хотите свести, используя либо точное сопоставление, либо шаблоны. Пример: 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 (Развернуть по) Развёртывание корня Проекция
goods.customers нет имя
клиент = товар. клиент

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

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

Нельзя развернуть корневой элемент сложного массива

Unroll by (Развернуть по) Развёртывание корня Проекция
товары.заказы.отправлено.товарыЗаказа нет имя
orderId = goods.orders.orderId
itemName = наименованиеТовара.заказы.отправленные.элементыЗаказа.наименованиеТовара
itemQty = товары.заказы.shipped.orderItems.itemQty
местоположение = местоположение

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

{ '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 (Развернуть по) Развёртывание корня Проекция
товары.заказы товары.заказы имя
товары.заказы.отгружены.заказанныеТовары.имяТовара
товары.клиенты
расположение

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

{ '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 (Развернуть по) Развёртывание корня Проекция
товары.заказы.отправлены.пунктЗаказа товары.заказы имя
orderId = goods.orders.orderId
itemName = наименованиеТовара.заказы.отправленные.элементыЗаказа.наименованиеТовара
itemQty = товары.заказы.shipped.orderItems.itemQty
местоположение = местоположение

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

{ '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)