Transformation d’aplatissement dans le flux de données de mappage

S’APPLIQUE À : Azure Data Factory Azure Synapse Analytics

Conseil

Essayez Data Factory dans Microsoft Fabric, une solution d’analyse tout-en-un pour les entreprises. Microsoft Fabric couvre tous les aspects, du déplacement des données à la science des données, en passant par l’analyse en temps réel, l’aide à la décision et la création de rapports. Découvrez comment démarrer un nouvel essai gratuitement !

Les flux de données sont disponibles à la fois dans les pipelines Azure Data Factory et Azure Synapse. Cet article s’applique aux flux de données de mappage. Si vous débutez dans le domaine des transformations, consultez l’article d’introduction Transformer des données avec un flux de données de mappage.

Utilisez la transformation d’aplatissement pour prendre des valeurs de tableau à l’intérieur de structures hiérarchiques, par exemple au format JSON, et les dérouler dans des lignes individuelles. Ce processus est appelé « dénormalisation ».

Configuration

La transformation d’aplatissement contient les paramètres de configuration suivants.

Screenshot that shows flatten settings.

Dérouler par

Sélectionnez un tableau à dérouler. Les données de sortie comporteront une ligne par élément dans chaque tableau. Si le tableau « Dérouler par » sur la ligne d’entrée est null ou vide, il y aura une ligne de sortie avec des valeurs non déroulées en tant que null. Vous pouvez dérouler plusieurs tableaux par transformation aplatie. Cliquez sur le bouton plus (+) pour inclure plusieurs tableaux dans une unique transformation aplatie. Vous pouvez utiliser des méta-fonctions de flux de données ADF ici, notamment name et type, tout en utilisant les critères spéciaux pour déployer des tableaux qui correspondent à ces critères. Lorsque vous ajoutez plusieurs tableaux à une unique transformation Flatten, vos résultats sont un produit cartésien de toutes les possibles valeurs du tableau.

Screenshot that shows flatten results.

Racine du déroulement

Par défaut, la transformation d’aplatissement déroule un tableau au sommet de la hiérarchie dans laquelle il existe. Vous pouvez éventuellement sélectionner un tableau comme racine de déroulement. La racine de déroulement doit être un tableau d’objets complexes qui est ou contient le tableau « Dérouler par ». Si une racine de déroulement est sélectionnée, les données de sortie contiennent au moins une ligne par élément dans la racine de déroulement. Si la ligne d’entrée n’a aucun élément dans la racine de déroulement, elle est supprimée des données de sortie. Le choix d’une racine de déroulement génère toujours un nombre de lignes inférieur ou égal au comportement par défaut.

Mappage de l’aplatissement

Comme pour la transformation de sélection, choisissez la projection de la nouvelle structure à partir des champs entrants et du tableau dénormalisé. Si un tableau dénormalisé est mappé, la colonne de sortie a le même type de données que le tableau. Si le tableau « Dérouler par » est un tableau d’objets complexes qui contient des sous-tableaux, le mappage d’un élément de ce sous-tableau génère un tableau.

Pour vérifier votre sortie de mappage, reportez-vous à l’onglet Inspection et à la vue d’ensemble des données.

Mappage basé sur des règles

La transformation d’aplatissement prend en charge le mappage basé sur des règles, ce qui vous permet de créer des transformations dynamiques et flexibles qui aplatiront les tableaux en fonction des règles, et aplatiront les structures en fonction des niveaux de la hiérarchie.

Flatten pattern

Condition de correspondance

Entrez une condition de correspondance de modèle pour la ou les colonnes que vous souhaitez aplatir en fonction de correspondances exactes ou de modèles. Exemple : like(name,'cust%')

Parcours de colonne en profondeur

Paramètre facultatif qui indique au service de gérer toutes les sous-colonnes d’un objet complexe individuellement au lieu de gérer l’objet complexe comme une colonne entière.

Niveau de hiérarchie

Choisissez le niveau de hiérarchie que vous souhaitez développer.

Correspondances de nom (regex)

Si vous le souhaitez, choisissez d’exprimer votre correspondance de nom sous forme d’expression régulière dans cette zone, au lieu d’utiliser la condition de correspondance ci-dessus.

Exemples

Reportez-vous à l’objet JSON suivant pour les exemples ci-dessous de transformation d’aplatissement.

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

Aucune racine de déroulement avec tableau de chaînes

Dérouler par Racine du déroulement Projection
goods.customers Aucun Nom
customer = goods.customer

Sortie

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

Aucune racine de déroulement avec tableau complexe

Dérouler par Racine du déroulement Projection
goods.orders.shipped.orderItems Aucun Nom
orderId = goods.orders.orderId
itemName = goods.orders.shipped.orderItems.itemName
itemQty = goods.orders.shipped.orderItems.itemQty
location = location

Sortie

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

Même racine que le tableau de déroulement

Dérouler par Racine du déroulement Projection
goods.orders goods.orders Nom
goods.orders.shipped.orderItems.itemName
goods.customers
location

Sortie

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

Racine de déroulement avec tableau complexe

Dérouler par Racine du déroulement Projection
goods.orders.shipped.orderItem goods.orders Nom
orderId = goods.orders.orderId
itemName = goods.orders.shipped.orderItems.itemName
itemQty = goods.orders.shipped.orderItems.itemQty
location = location

Sortie

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

Script de flux de données

Syntaxe

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

Exemple

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)