Combinación y optimización de datos
Las organizaciones suelen intercalar diferentes tipos de información de muchos orígenes. La información se almacena en un gran número de tablas. En ocasiones, es posible que tenga que combinar tablas basadas en relaciones lógicas entre ellas, para realizar análisis o informes más profundos. En el escenario de la empresa minorista, usa tablas para clientes, productos e información de ventas.
En este módulo, aprenderá distintas formas en que puede combinar datos en consultas de Kusto para proporcionar a los miembros de su equipo la información que necesita para aumentar el conocimiento del producto y las ventas.
Comprensión de los datos
Antes de empezar a escribir consultas que combinen información de las tablas, deberá comprender los datos. Al trabajar con consultas de Kusto, quiere pensar en las tablas que pertenecen ampliamente a una de estas dos categorías:
- Tablas de hechos: tablas cuyos registros son hechos inmutables, como la tabla SalesFact en el escenario de la empresa minorista. En estas tablas, los registros se anexan progresivamente en forma de streaming o en fragmentos grandes. Los registros permanecen en la tabla hasta que se quitan y nunca se actualizan.
- Tablas de dimensiones: tablas cuyos registros son dimensiones mutables, como las tablas Customers y Products en el escenario de la empresa minorista. Estas tablas contienen datos de referencia, como tablas de búsqueda de un identificador de entidad a sus propiedades. Las tablas de dimensiones no se actualizan regularmente con nuevos datos.
En el caso de nuestra empresa minorista, se usan tablas de dimensiones para enriquecer la tabla SalesFact con información adicional o para proporcionar más opciones para filtrar los datos de las consultas.
También querrá comprender los volúmenes de datos con los que está trabajando y su estructura, o esquema (nombres y tipos de columna). Puede ejecutar las siguientes consultas para obtener esa información reemplazando TABLE_NAME por el nombre de la tabla que está examinando:
Para obtener el número de registros de una tabla, use el operador
count
:TABLE_NAME | count
Para obtener el esquema de una tabla, use el operador
getschema
:TABLE_NAME | getschema
La ejecución de estas consultas en las tablas de hechos y dimensiones en el escenario de la empresa minorista le proporciona información como en el ejemplo siguiente:
Tabla | Registros | Schema |
---|---|---|
SalesFact | 2 832 193 | - SalesAmount (real) - TotalCost (real) - DateKey (datetime) - ProductKey (longitud) - CustomerKey (longitud) |
Clientes | 18 484 | - CityName (cadena) - CompanyName (cadena) - ContinentName (cadena) - CustomerKey (longitud) - Education (cadena) - FirstName (cadena) - Gender (cadena) - LastName (cadena) - MaritalStatus (cadena) - Occupation (cadena) - RegionCountryName (cadena) - StateProvinceName (cadena) |
Productos | 2517 | - ProductName (cadena) - Manufacturer (cadena) - ColorName (cadena) - ClassName (cadena) - ProductCategoryName (cadena) - ProductSubcategoryName (cadena) - ProductKey (longitud) |
En la tabla, resaltamos los identificadores únicos CustomerKey y ProductKey que se usan para combinar registros entre tablas.
Descripción de las consultas de varias tablas
Después de analizar los datos, debe comprender cómo combinar tablas para proporcionar la información que necesita. Las consultas de Kusto proporcionan varios operadores que puede usar para combinar datos de varias tablas, incluidos los operadores lookup
, join
y union
.
El operador join
combina las filas de dos tablas haciendo coincidir los valores de las columnas especificadas de cada tabla. La tabla resultante depende del tipo de combinación que use. Por ejemplo, si usa una combinación interna, la tabla tiene las mismas columnas que la tabla izquierda (a veces denominada tabla externa), además de las columnas de la tabla derecha (a veces denominada tabla interna). En la siguiente sección, aprenderá más sobre los tipos de combinación. Para obtener el mejor rendimiento, si una tabla siempre es menor que la otra, úsela como lado izquierdo del operador join
.
El operador lookup
es una implementación especial de un operador join
que optimiza el rendimiento de las consultas en las que una tabla de hechos se enriquece con datos de una tabla de dimensión. Extiende la tabla de hechos con valores que se buscan en una tabla de dimensiones. Para obtener el mejor rendimiento, el sistema supone de forma predeterminada que la tabla izquierda es la tabla más grande (hecho) y la tabla derecha es la tabla más pequeña (dimensión). Esta suposición es exactamente lo contrario a la suposición utilizada por el operador join
.
El operador union
devuelve todas las filas de dos o más tablas. Resulta útil cuando desea combinar datos de varias tablas.
La función materialize()
almacena en caché los resultados dentro de una ejecución de consulta para su reutilización posterior en la consulta. Es como tomar una instantánea de los resultados de una subconsulta y usarla varias veces dentro de la consulta. Esta función es útil para optimizar las consultas en escenarios en los que los resultados:
- Son caros de procesar
- Son no deterministas
En breve, obtendrá más información sobre los distintos operadores de combinación de tablas y la función materialize()
, y cómo usarlos.
Tipos de combinación
Hay muchos tipos de combinaciones diferentes que se pueden realizar que afectan al esquema y las filas de la tabla resultante. En la tabla siguiente se muestran los tipos de combinaciones admitidas por el Lenguaje de consulta Kusto y el esquema y las filas que devuelven:
Tipo de combinación | Descripción | Ilustración |
---|---|---|
innerunique (valor predeterminado) |
Combinación interna con desduplicación del lado izquierdo Esquema: todas las columnas de ambas tablas, incluidas las claves coincidentes Filas: todas las filas desduplicadas de la tabla izquierda que coinciden con las filas de la tabla derecha |
![]() |
inner |
Combinación interna estándar Esquema: todas las columnas de ambas tablas, incluidas las claves coincidentes Filas: solo las filas coincidentes de ambas tablas |
![]() |
leftouter |
Combinación externa izquierda Esquema: todas las columnas de ambas tablas, incluidas las claves coincidentes Filas: todos los registros de la tabla izquierda y solo las filas coincidentes de la tabla derecha |
![]() |
rightouter |
Combinación externa derecha Esquema: todas las columnas de ambas tablas, incluidas las claves coincidentes Filas: todos los registros de la tabla derecha y solo las filas coincidentes de la tabla izquierda |
![]() |
fullouter |
Combinación externa completa Esquema: todas las columnas de ambas tablas, incluidas las claves coincidentes Filas: todos los registros de ambas tablas con celdas no coincidentes rellenadas con null |
![]() |
leftsemi |
Semicombinación izquierda Esquema: todas las columnas de la tabla izquierda Filas: todos los registros de la tabla izquierda que coinciden con los registros de la tabla derecha |
![]() |
leftanti , anti , leftantisemi |
Left-Anti Join y variante Semi Esquema: todas las columnas de la tabla izquierda Filas: todos los registros de la tabla izquierda que no coinciden con los registros de la tabla derecha |
![]() |
rightsemi |
Semicombinación derecha Esquema: todas las columnas de la tabla derecha Filas: todos los registros de la tabla derecha que coinciden con los registros de la tabla izquierda |
![]() |
rightanti , rightantisemi |
Right-Anti Join y variante Semi Esquema: todas las columnas de la tabla derecha Filas: todos los registros de la tabla derecha que no coinciden con los registros de la tabla izquierda |
![]() |
Observe que el tipo de combinación predeterminado es innerunique
y no es necesario especificarlo. Pero se recomienda especificar siempre explícitamente el tipo de combinación para mayor claridad.
A medida que avance en este módulo también obtendrá información sobre las funciones de agregación arg_min()
y arg_max()
, el operador as
como alternativa a la instrucción let
y la función startofmonth()
para ayudar con la agrupación de datos por mes.