Compartir a través de


Complemento bag_unpack

Se aplica a: ✅Microsoft FabricAzure Data Explorer

El bag_unpack complemento desempaqueta una sola columna de tipo dynamic, tratando cada ranura de nivel superior de contenedor de propiedades como una columna. El complemento se invoca con el evaluate operador .

Sintaxis

Columna T|evaluatebag_unpack( [, ] [, ] [, ] [):

Obtenga más información sobre las convenciones de sintaxis.

Parámetros

Nombre Tipo Obligatorio Descripción
T string ✔️ Entrada tabular cuya columna columna se va a desempaquetar.
Columna dynamic ✔️ Columna de T que se va a desempaquetar.
OutputColumnPrefix string Prefijo común que se va a agregar a todas las columnas generadas por el complemento.
columnsConflict string Dirección para la resolución de conflictos de columnas. Valores válidos:
error - La consulta genera un error (valor predeterminado)
replace_source - Se reemplaza la columna de origen.
keep_source - Se mantiene la columna de origen.
ignoredProperties dynamic Conjunto opcional de propiedades de contenedor que se omitirán. }
OutputSchema Especifique los nombres y tipos de columna para la salida del bag_unpack complemento. Para obtener información sobre la sintaxis, consulte Sintaxis de esquema de salida y para comprender las implicaciones, consulte Consideraciones de rendimiento.

Sintaxis de esquema de salida

( ColumnName:ColumnType [, ...])

Use un carácter comodín * como primer parámetro para incluir todas las columnas de la tabla de origen en la salida, como se indica a continuación:

( * , ColumnName:ColumnType [, ...])

Consideraciones sobre el rendimiento

El uso del complemento sin outputSchema puede tener graves implicaciones de rendimiento en grandes conjuntos de datos y debe evitarse.

Proporcionar outputSchema permite al motor de consultas optimizar la ejecución de la consulta, ya que puede determinar el esquema de salida sin necesidad de analizar y analizar los datos de entrada. Esto es beneficioso cuando los datos de entrada son grandes o complejos. Consulte los ejemplos con implicaciones de rendimiento del uso del complemento con y sin outputSchema definido.

Devoluciones

El bag_unpack complemento devuelve una tabla con tantos registros como su entrada tabular (T). El esquema de la tabla es el mismo que el esquema de su entrada tabular con las siguientes modificaciones:

  • Se quita la columna de entrada especificada (Columna).
  • El nombre de cada columna corresponde al nombre de cada ranura, prefijo opcionalmente por OutputColumnPrefix.
  • El tipo de cada columna es el tipo de ranura, si todos los valores de la misma ranura tienen el mismo tipo, o dynamic, si los valores difieren en el tipo.
  • El esquema se extiende con tantas columnas como hay ranuras distintas en los valores de contenedor de propiedades de nivel superior de T.

Nota:

  • Si no especifica OutputSchema, el esquema de salida del complemento varía en función de los valores de datos de entrada. Varias ejecuciones del complemento con diferentes entradas de datos pueden generar esquemas de salida diferentes.
  • Si se especifica outputSchema , el complemento devuelve solo las columnas definidas en la sintaxis del esquema de salida, a menos que se use un carácter comodín * .
  • Para devolver todas las columnas de los datos de entrada y las columnas definidas en OutputSchema, use un carácter comodín * en OutputSchema.

Las reglas de esquema tabular se aplican a los datos de entrada. En concreto:

  • Un nombre de columna de salida no puede ser el mismo que una columna existente en la entrada tabular T, a menos que sea la columna que se va a desempaquetar (Columna). De lo contrario, la salida incluye dos columnas con el mismo nombre.
  • Todos los nombres de ranura, cuando outputColumnPrefix prefijo, deben ser nombres de entidad válidos y seguir las reglas de nomenclatura de identificadores.

El complemento omite los valores NULL.

Ejemplos

Los ejemplos de esta sección muestran cómo usar la sintaxis para ayudarle a empezar.

Expanda una bolsa:

datatable(d:dynamic)
[
    dynamic({"Name": "John", "Age":20}),
    dynamic({"Name": "Dave", "Age":40}),
    dynamic({"Name": "Jasmine", "Age":30}),
]
| evaluate bag_unpack(d)

Salida

Edad Nombre
20 Juan
40 Dave
30 Jazmín

Expanda un contenedor y use la OutputColumnPrefix opción para generar nombres de columna con un prefijo:

datatable(d:dynamic)
[
    dynamic({"Name": "John", "Age":20}),
    dynamic({"Name": "Dave", "Age":40}),
    dynamic({"Name": "Jasmine", "Age":30}),
]
| evaluate bag_unpack(d, 'Property_')

Salida

Property_Age Property_Name
20 Juan
40 Dave
30 Jazmín

Expanda un contenedor y use la columnsConflict opción para resolver un conflicto de columna entre la columna dinámica y la columna existente:

datatable(Name:string, d:dynamic)
[
    'Old_name', dynamic({"Name": "John", "Age":20}),
    'Old_name', dynamic({"Name": "Dave", "Age":40}),
    'Old_name', dynamic({"Name": "Jasmine", "Age":30}),
]
| evaluate bag_unpack(d, columnsConflict='replace_source') // Use new name

Salida

Edad Nombre
20 Juan
40 Dave
30 Jazmín
datatable(Name:string, d:dynamic)
[
    'Old_name', dynamic({"Name": "John", "Age":20}),
    'Old_name', dynamic({"Name": "Dave", "Age":40}),
    'Old_name', dynamic({"Name": "Jasmine", "Age":30}),
]
| evaluate bag_unpack(d, columnsConflict='keep_source') // Keep old name

Salida

Edad Nombre
20 Old_name
40 Old_name
30 Old_name

Expanda una bolsa y use la ignoredProperties opción para omitir 2 de las propiedades del contenedor de propiedades:

datatable(d:dynamic)
[
    dynamic({"Name": "John", "Age":20, "Address": "Address-1" }),
    dynamic({"Name": "Dave", "Age":40, "Address": "Address-2"}),
    dynamic({"Name": "Jasmine", "Age":30, "Address": "Address-3"}),
]
// Ignore 'Age' and 'Address' properties
| evaluate bag_unpack(d, ignoredProperties=dynamic(['Address', 'Age']))

Salida

Nombre
Juan
Dave
Jazmín

Expanda un contenedor y use la opción OutputSchema:

datatable(d:dynamic)
[
    dynamic({"Name": "John", "Age":20}),
    dynamic({"Name": "Dave", "Age":40}),
    dynamic({"Name": "Jasmine", "Age":30}),
]
| evaluate bag_unpack(d) : (Name:string, Age:long)

Salida

Nombre Edad
Juan 20
Dave 40
Jazmín 30

Expanda un contenedor con outputSchema y use la opción comodín*:

Esta consulta devuelve la descripción de ranura original y las columnas definidas en OutputSchema.

datatable(d:dynamic, Description: string)
[
    dynamic({"Name": "John", "Age":20, "height":180}), "Student",
    dynamic({"Name": "Dave", "Age":40, "height":160}), "Teacher",
    dynamic({"Name": "Jasmine", "Age":30, "height":172}), "Student",
]
| evaluate bag_unpack(d) : (*, Name:string, Age:long)

Salida

Descripción Nombre Edad
Estudiante Juan 20
Docente Dave 40
Estudiante Jazmín 30

Ejemplos con implicaciones de rendimiento

Expanda un contenedor con y sin outputSchema definido para comparar las implicaciones de rendimiento:

En este ejemplo se usa una tabla disponible públicamente en el clúster de ayuda. En la base de datos ContosoSales , hay una tabla denominada SalesDynamic. La tabla contiene datos de ventas e incluye una columna dinámica denominada Customer_Properties.

Captura de pantalla de la tabla SalesDynamic con la columna propiedades del cliente resaltada.

  • Ejemplo sin esquema de salida: la primera consulta no define outputSchema. La consulta tarda 5,84 segundos en CPU y examina 36,39 MB de datos.

    SalesDynamic
    | evaluate bag_unpack(Customer_Properties) 
    | summarize Sales=sum(SalesAmount) by Country, State
    
  • Ejemplo con el esquema de salida: la segunda consulta proporciona una outputSchema. La consulta tarda 0,45 segundos en CPU y examina 19,31 MB de datos. La consulta no tiene que analizar la tabla de entrada, ahorrando tiempo de procesamiento.

    SalesDynamic
    | evaluate bag_unpack(Customer_Properties) :  (*, Country:string, State:string, City:string)
    | summarize Sales=sum(SalesAmount) by Country, State
    

Salida

La salida es la misma para ambas consultas. A continuación se muestran las primeras 10 filas de la salida.

Canadá Columbia Británica 56,101,083
Reino Unido Inglaterra 77,288,747
Australia Victoria 31,242,423
Australia Queensland 27,617,822
Australia Australia Meridional 8,530,537
Australia Nueva Gales del Sur 54,765,786
Australia Tasmania 3,704,648
Canadá Alberta 375,061
Canadá Ontario 38,282
Estados Unidos Washington 80,544,870
... ... ...