martes, 6 de julio de 2021

Power Query: Metadata, información adicional para nuestros datos

Sin lugar a duda este tema de hoy: los Metadata es uno de los más curiosos (e interesantes) que nos podemos encontrar...
Todos tenemos claro el concepto de dato, es la información que vemos reflejada en nuestras fuentes, nuestras tablas.. es algo 'palpable', un valor concreto.

¿Pero sabías que puedes añadir información adicional asociado a esos valores?... esto son los Metadata: un Registro de valores que se conoce como registro de metadatos de un valor.
Este registro de metadatos se puede asociar a cualquier tipo de valor; y el resultado de este tipo de asociación es un nuevo valor con los metadatos especificados.

Por tanto, no nos perdamos... un registro de metadatos sigue siendo un registro normal, y podrá estar compuesto de todos los campos y valores de un registro normal, pero al mismo tiempo contener información extra.

Ten presente, para tu tranquilidad, que la asociación de un registro de metadatos con un valor es "no intrusiva", es decir, no cambia el comportamiento del valor principal en las evaluaciones, excepto obviamente en el de las acciones que inspeccionan dichos registros de metadatos de forma directa y explícita.

Aunque no seamos conscientes, todos los valores tiene un registro de metadatos predeterminado, incluso aunque no se haya asignado ninguno, en estos casos el registro de metadatos por defecto es el vacío (i.e., [] ).

Tres funciones M para trabajar sobre el registro de metadatos son:
- Value.Metadata(value as any) as any
La cual nos devuelve un registro que contiene los metadatos de entrada.
- Value.RemoveMetadata(value as any, optional metaValue as any) as any
La cual elimina el registro de metadatos.
- Value.ReplaceMetadata(value as any, metaValue as any) as any
Que sustituye la información recogida en el registro de metados del valor.

Igualmente importante el operador meta para asociar un registro de metadatos a un valor.

Veamos todo esto con algún ejemplo sencillo...
Desde nuestro editor de consultas de Power Query crearemos una consulta en blanco (que llamaré 'Metadata_Ejem1') y accederemos a ella desde el Editor avanzado, donde escribiremo:
let
    md1 = "excelforo" meta [conocimientos={"Excel","Power Query", "Power Pivot","VBA para Excel"}],
	//para recuperar 'el campo 'conocimientos'... que la hemos creado como una lista
    dato=Value.Metadata(md1)[conocimientos]
in
    dato

El resultado de la consulta será la lista:
Power Query: Metadata, información adicional para nuestros datos

Por otra parte, si hubieramos querido recuperar el valor principal, podríamos haber hecho:
let
    md1 = "excelforo" meta [conocimientos={"Excel","Power Query", "Power Pivot","VBA para Excel"}],
	//para recuperar 'el campo 'conocimientos'... que la hemos creado como una lista
    dato=Value.Metadata(md1)[conocimientos]
in
    Text.Upper(md1)

que nos hubiera devuelto el valor en mayúsculas: EXCELFORO

Veamos otro ejemplo...
Definimos un metadato con una dupla de valores: posición y conocimientos
let
    md1 = "excelforo" meta [posicion=2 , conocimientos={"Excel","Power Query", "Power Pivot","VBA para Excel"}],

    dato=Value.Metadata(md1)[conocimientos]{Value.Metadata(md1)[posicion]}
in
    dato

Lo que nos devolverá, sobre la lista de conocimientos, el dato en la posición 2 (en base 0), es decir, 'Power Pivot'.

Otro ejemplo del uso de metadatos para reemplazarlos.
En este caso reemplazaremos el valor asignado al valor 'posición' del registro de metadatos:
let
    md1 = "excelforo" meta [posicion=2 , conocimientos={"Excel","Power Query", "Power Pivot","VBA para Excel"}],

    //reemplazamos metadato
    //provocaría fallo al NO mencionar el campo 'conocimientos'
    //ReemplazaMD1= Value.ReplaceMetadata(md1, [posicion=3]),
    
    //recuperamos el valor del registro de metadato de 'conocimientos'
	//  ReemplazaMD1= Value.ReplaceMetadata(md1, [posicion=3, conocimientos=Value.Metadata(md1)[conocimientos]]),
    
    //o también usando el operador de unión/concatenación &
	//	ReemplazaMD1= Value.ReplaceMetadata(md1, [posicion=3] & [conocimientos=Value.Metadata(md1)[conocimientos]]),

	//o mucho más simple forzando una sobreescritura
    ReemplazaMD1=md1 meta [posicion=3],
    
    dato=Value.Metadata(ReemplazaMD1)[conocimientos]{Value.Metadata(ReemplazaMD1)[posicion]}
in
    dato

Al reemplazarlo por 'posición' = 3 la consulta recuperaría el metadato 'VBA para Excel'

LLamando de nuevo al operador meta podemos incorporar nuevos valores al registro de metadatos, por ejemplo, una 'valoración':
let
    md1 = "excelforo" meta [posicion=2 , conocimientos={"Excel","Power Query", "Power Pivot","VBA para Excel"}],

    //añade nuevo metadato
    nuevo= md1 meta [valoración=10],

    dato=Value.Metadata(nuevo)[valoración]
in
    dato

Si necesitáramos visualizar el registro de metadatos completo haríamos:
let
    md1 = "excelforo" meta [posicion=2 , conocimientos={"Excel","Power Query", "Power Pivot","VBA para Excel"}],

    //añade nuevo metadato
    nuevo= md1 meta [valoración=10]

in
    Value.Metadata(nuevo)

Power Query: Metadata, información adicional para nuestros datos


Y acabamos eliminando metadatos con Value.RemoveMetadata.
Por ejemplo, para eliminar todo el registro de metadatos haríamos:
let
    md1 = "excelforo" meta [posicion=2 , conocimientos={"Excel","Power Query", "Power Pivot","VBA para Excel"}],

    //añade nuevo metadato
    nuevo= md1 meta [valoración=10],

    //Eliminamos metadatos
    eliminacion=Value.RemoveMetadata(nuevo)

in
    Value.Metadata(eliminacion)

lo que nos devolvería el vacío, un registro sin valores...

Alternativamente, para eliminar uno de los valores del registro de metadatos podríamos emplear la función ya vista Value.ReplaceMetada. Por ejemplo para quedarnos solo con los valores 'posicon' y 'valoración' haríamos:
let
    md1 = "excelforo" meta [posicion=2 , conocimientos={"Excel","Power Query", "Power Pivot","VBA para Excel"}],
	
    //añade nuevo metadato
    nuevo= md1 meta [valoración=10],
    
    //Eliminamos metadatos
    eliminacion=Value.ReplaceMetadata(nuevo, [posicion=2, valoración=10])

in
    Value.Metadata(eliminacion)

Lo que nos deja un registro de metadatos con esos dos valores...

En la siguiente entrada del blog le daremos un uso especial a estos registros de metadatos ;-)

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.