Compartir a través de


Transformación Aplanar en el flujo de datos de asignación

SE APLICA A: Azure Data Factory Azure Synapse Analytics

Sugerencia

Pruebe Data Factory en Microsoft Fabric, una solución de análisis todo en uno para empresas. Microsoft Fabric abarca todo, desde el movimiento de datos hasta la ciencia de datos, el análisis en tiempo real, la inteligencia empresarial y los informes. Obtenga información sobre cómo iniciar una nueva evaluación gratuita.

Los flujos de datos están disponibles en las canalizaciones Azure Data Factory y Azure Synapse. Este artículo se aplica a los flujos de datos de asignación. Si carece de experiencia con las transformaciones, consulte el artículo de introducción Transformación de datos mediante flujos de datos de asignación.

Use la transformación Aplanar para tomar valores de matriz incluidos en estructuras jerárquicas, como JSON, y expandirlos en filas individuales. Este proceso se conoce como desnormalización.

Configuración

La transformación Aplanar contiene los siguientes valores de configuración.

Captura de pantalla que muestra la configuración de acoplamiento.

Expandir por

Seleccione la matriz que se va a expandir. Los datos de salida tendrán una fila por cada elemento de cada matriz. Si la matriz que se va a expandir de la fila de entrada tiene un valor NULL o está vacía, habrá una fila de salida con valores no expandidos con valor NULL. Tiene la opción de anular la inscripción de más de una matriz por transformación de acoplamiento. Haga clic en el botón más (+) para incluir varias matrices en una sola transformación de acoplamiento. Puede usar las funciones meta de flujo de datos de ADF aquí, incluidas name y type, y usar la coincidencia de patrones para anular la inscripción de matrices que coincidan con esos criterios. Al incluir varias matrices en una sola transformación de acoplamiento, los resultados serán un producto cartesiano de todos los valores de matriz posibles.

Captura de pantalla que muestra los resultados de acoplamiento.

Expandir la raíz

De forma predeterminada, la transformación Aplanar expande una matriz sobre la jerarquía en la que existe. Opcionalmente, puede seleccionar una matriz como raíz de la expansión. La raíz de la expansión debe ser una matriz de objetos complejos que sea o que contenga la matriz que se va a expandir. Si se selecciona una raíz de expansión, los datos de salida contendrán al menos una fila por cada elemento de dicha raíz. Si la fila de entrada no tiene ningún elemento de la raíz de expansión, se quitará de los datos de salida. Al elegir una raíz de expansión, siempre se generará un número de filas menor o igual que el comportamiento predeterminado.

Asignación de aplanamiento

De forma similar a la transformación de selección, elija la proyección de la nueva estructura a partir de los campos de entrada y la matriz desnormalizada. Si se asigna una matriz desnormalizada, la columna de salida tendrá el mismo tipo de datos que la matriz. Si la matriz de expansión es una matriz de objetos complejos que contiene submatrices, la asignación de un elemento de dicha submatriz producirá una matriz.

Consulte la pestaña de inspección y la vista previa de los datos para comprobar la salida de la asignación.

Asignación basada en reglas

La transformación de aplanamiento admite la asignación basada en reglas, lo que permite crear transformaciones dinámicas y flexibles que aplanarán matrices según reglas y estructuras planas basadas en niveles de jerarquía.

Patrón de aplanamiento

Condición de coincidencia

Escriba una condición de coincidencia de patrones para la o las columnas que quiera aplanar mediante coincidencias exactas o patrones. Ejemplo: like(name,'cust%')

Recorrido de columna profundo

Valor opcional que indica al servicio que controle todas las subcolumnas de un objeto complejo individualmente en lugar de controlar el objeto complejo como una columna completa.

Nivel de jerarquía

Elija el nivel de la jerarquía que quiere expandir.

Coincidencias de nombres (regex)

De manera opcional, elija expresar la coincidencia de nombres como una expresión regular en este cuadro, en lugar de usar la condición de coincidencia anterior.

Ejemplos

Consulte el siguiente objeto JSON como referencia para los ejemplos siguientes de la transformación Aplanar.

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

Sin raíz de expansión, con matriz de cadenas

Expandir por Expandir la raíz Proyección
goods.customers Ninguno name
customer = goods.customer

Output

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

Sin raíz de expansión, con matriz compleja

Expandir por Expandir la raíz Proyección
goods.orders.shipped.orderItems Ninguno name
orderId = goods.orders.orderId
itemName = goods.orders.shipped.orderItems.itemName
itemQty = goods.orders.shipped.orderItems.itemQty
location = location

Output

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

Misma raíz que la matriz de expansión

Expandir por Expandir la raíz Proyección
goods.orders goods.orders name
goods.orders.shipped.orderItems.itemName
goods.customers
ubicación

Output

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

Raíz de expansión, con matriz compleja

Expandir por Expandir la raíz Proyección
goods.orders.shipped.orderItem goods.orders name
orderId = goods.orders.orderId
itemName = goods.orders.shipped.orderItems.itemName
itemQty = goods.orders.shipped.orderItems.itemQty
location = location

Output

{ '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 flujo de datos

Sintaxis

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

Ejemplo

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)