Spłaszczanie transformacji w przepływie danych mapowania

DOTYCZY: Azure Data Factory Azure Synapse Analytics

Napiwek

Wypróbuj usługę Data Factory w usłudze Microsoft Fabric — rozwiązanie analityczne typu all-in-one dla przedsiębiorstw. Usługa Microsoft Fabric obejmuje wszystko, od przenoszenia danych do nauki o danych, analizy w czasie rzeczywistym, analizy biznesowej i raportowania. Dowiedz się, jak bezpłatnie rozpocząć nową wersję próbną !

Przepływy danych są dostępne zarówno w usłudze Azure Data Factory, jak i w potokach usługi Azure Synapse. Ten artykuł dotyczy przepływów danych mapowania. Jeśli dopiero zaczynasz transformacje, zapoznaj się z artykułem wprowadzającym Przekształcanie danych przy użyciu przepływu danych mapowania.

Użyj przekształcenia spłaszczania, aby pobrać wartości tablic wewnątrz struktur hierarchicznych, takich jak JSON, i wyrejestrować je do poszczególnych wierszy. Ten proces jest nazywany denormalizacją.

Konfigurowanie

Przekształcenie spłaszczane zawiera następujące ustawienia konfiguracji.

Screenshot that shows flatten settings.

Wyrejestrowywanie według

Wybierz tablicę do wyrejestrowania. Dane wyjściowe będą miały jeden wiersz na element w każdej tablicy. Jeśli wyrejestrowanie według tablicy w wierszu wejściowym ma wartość null lub jest puste, będzie jeden wiersz wyjściowy z wartościami wyrejestrowanym jako null. Istnieje możliwość wyrejestrowania więcej niż jednej tablicy na przekształcenie spłaszczane. Kliknij przycisk plus (+), aby uwzględnić wiele tablic w jednej transformacji Spłaszczanej. W tym miejscu możesz użyć funkcji meta przepływu danych usługi ADF, w tym name i type użyć dopasowania wzorca do wyrejestrowywania tablic, które spełniają te kryteria. W przypadku dołączania wielu tablic w jednej transformacji spłaszczanej wyniki będą produktem kartezjańskim wszystkich możliwych wartości tablicowych.

Screenshot that shows flatten results.

Wyrejestrowywanie katalogu głównego

Domyślnie przekształcenie spłaszcza wyrejestruje tablicę na początku hierarchii, w którą istnieje. Opcjonalnie możesz wybrać tablicę jako katalog główny wyrejestrowania. Katalog główny wyrejestrowania musi być tablicą obiektów złożonych, które są lub zawierają wyrejestrowanie według tablicy. Jeśli wybrano katalog główny wyrejestrowania, dane wyjściowe będą zawierać co najmniej jeden wiersz na elementy w katalogu głównym wyrejestrowania. Jeśli wiersz wejściowy nie zawiera żadnych elementów w katalogu głównym wyrejestrowania, zostanie on usunięty z danych wyjściowych. Wybranie katalogu głównego wyrejestrowania zawsze spowoduje zwrócenie mniejszej lub równej liczby wierszy niż zachowanie domyślne.

Mapowanie spłaszczane

Podobnie jak w przypadku transformacji wyboru, wybierz projekcję nowej struktury z pól przychodzących i zdenormalizowanej tablicy. Jeśli zostanie zamapowana zdenormalizowana tablica, kolumna wyjściowa będzie taka sama jak tablica. Jeśli wyrejestrowanie według tablicy jest tablicą złożonych obiektów, które zawierają podarray, mapowanie elementu tej podarry spowoduje wyprowadzanie tablicy.

Zapoznaj się z kartą inspekcji i podglądem danych, aby zweryfikować dane wyjściowe mapowania.

Mapowanie oparte na regułach

Transformacja spłaszczania obsługuje mapowanie oparte na regułach, co umożliwia tworzenie dynamicznych i elastycznych przekształceń, które spłaszczą tablice oparte na regułach i spłaszczeniu struktur na podstawie poziomów hierarchii.

Flatten pattern

Warunek dopasowania

Wprowadź warunek dopasowania wzorca dla kolumny lub kolumn, które chcesz spłaszczać przy użyciu dokładnych dopasowań lub wzorców. Przykład: like(name,'cust%')

Przechodzenie głębokiej kolumny

Opcjonalne ustawienie, które informuje usługę o obsłudze wszystkich podkolum obiektów złożonych indywidualnie zamiast obsługiwać obiekt złożony jako całą kolumnę.

Poziom hierarchii

Wybierz poziom hierarchii, który chcesz rozwinąć.

Dopasowania nazw (wyrażeń regularnych)

Opcjonalnie możesz wyrazić swoje dopasowanie nazwy jako wyrażenie regularne w tym polu, zamiast używać powyższego warunku dopasowania.

Przykłady

Zapoznaj się z poniższym obiektem JSON, aby zapoznać się z poniższymi przykładami spłaszczania przekształcenia

{
  "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"}

Brak wyrejestrowywania katalogu głównego z tablicą ciągów

Wyrejestrowywanie według Wyrejestrowywanie katalogu głównego Projekcja
goods.customers Brak Nazwa
customer = goods.customer

Wyjście

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

Brak wyrejestrowywania katalogu głównego ze złożoną tablicą

Wyrejestrowywanie według Wyrejestrowywanie katalogu głównego Projekcja
goods.orders.shipped.orderItems Brak Nazwa
orderId = goods.orders.orderId
itemName = goods.orders.shipped.orderItems.itemName
itemQty = goods.orders.shipped.orderItems.itemQty
location = location

Wyjście

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

Ten sam katalog główny co tablica wyrejestrowania

Wyrejestrowywanie według Wyrejestrowywanie katalogu głównego Projekcja
goods.orders goods.orders Nazwa
goods.orders.shipped.orderItems.itemName
goods.customers
lokalizacja

Wyjście

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

Wyrejestrowywanie katalogu głównego ze złożoną tablicą

Wyrejestrowywanie według Wyrejestrowywanie katalogu głównego Projekcja
goods.orders.shipped.orderItem goods.orders Nazwa
orderId = goods.orders.orderId
itemName = goods.orders.shipped.orderItems.itemName
itemQty = goods.orders.shipped.orderItems.itemQty
location = location

Wyjście

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

Skrypt przepływu danych

Składnia

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

Przykład

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)