GoogleSQL para BigQuery admite esbozos de datos. Un esbozo de datos es un resumen compacto de una agregación de datos. Incorpora toda la información necesaria para extraer un resultado de agregación, continuar una agregación de datos o combinarlo con otro esbozo, lo que permite volver a realizar la agregación.
El cálculo una métrica con un esbozo es mucho menos costoso que el cálculo un valor exacto. Si tu procesamiento es demasiado lento o requiere demasiado almacenamiento temporal, usa esbozos para reducir el tiempo de consulta y los recursos.
Además, solo se puede calcular cardinalidades (como la cantidad de usuarios distintos) o cuantiles (como la mediana de duración de las visitas) sin esbozos mediante la ejecución de trabajos en los datos sin procesar, debido a que los datos ya agregados no se pueden combinar más.
Considera una tabla con los siguientes datos:
| Producto | Número de usuarios | Mediana de duración de las visitas |
|---|---|---|
| Producto A | 500 millones | 10 minutos |
| Producto B | 20 millones | 2 minutos |
No es posible calcular la cantidad total de usuarios de ambos productos porque la tabla no muestra cuántos usuarios usaron ambos productos. Del mismo modo, no es posible calcular la mediana de la duración de las visitas porque se perdió la distribución de las duraciones de las visitas.
Una solución es almacenar esbozos en la tabla. Cada esbozo es una representación aproximada y compacta de una propiedad de entrada específica, como la cardinalidad, que puedes almacenar, combinar (o volver a agregar) y consultar para obtener resultados casi exactos. En el ejemplo anterior, puedes estimar la cantidad de usuarios distintos del producto A y el producto B si creas y combinas (vuelves a agregar) los esbozos de cada producto. También puedes estimar la mediana de duración de las visitas con esbozos cuantiles que, de igual modo, puedes combinar y consultar.
Por ejemplo, en la siguiente consulta, se usan esbozos de HLL++ y KLL para estimar los usuarios únicos y la mediana de la duración de las visitas en YouTube (producto A) y Google Maps (producto B):
-- Build sketches for YouTube stats. CREATE TABLE user.YOUTUBE_ACCESS_STATS AS SELECT HLL_COUNT.INIT(user_id) AS distinct_users_sketch, KLL_QUANTILES.INIT_INT64(visit_duration_ms) AS visit_duration_ms_sketch, hour_of_day FROM YOUTUBE_ACCESS_LOG() GROUP BY hour_of_day; -- Build sketches for Maps stats. CREATE TABLE user.MAPS_ACCESS_STATS AS SELECT HLL_COUNT.INIT(user_id) AS distinct_users_sketch, KLL_QUANTILES.INIT_INT64(visit_duration_ms) AS visit_duration_ms_sketch, hour_of_day FROM MAPS_ACCESS_LOG() GROUP BY hour_of_day; -- Query YouTube hourly stats. SELECT HLL_COUNT.EXTRACT(distinct_users_sketch) AS distinct_users, KLL_QUANTILES.EXTRACT_POINT_INT64(visit_duration_ms_sketch, 0.5) AS median_visit_duration, hour_of_day FROM user.YOUTUBE_ACCESS_STATS; -- Query YouTube daily stats. SELECT HLL_COUNT.MERGE(distinct_users_sketch), KLL_QUANTILES.MERGE_POINT_INT64(visit_duration_ms_sketch, 0.5) AS median_visit_duration, date FROM user.YOUTUBE_ACCESS_STATS GROUP BY date; -- Query total stats across YouTube and Maps. SELECT HLL_COUNT.MERGE(distinct_users_sketch) AS unique_users_all_services, KLL_QUANTILES.MERGE_POINT_INT64(visit_duration_ms_sketch, 0.5) AS median_visit_duration_all_services, FROM ( SELECT * FROM user.YOUTUBE_ACCESS_STATS UNION ALL SELECT * FROM user.MAPS_ACCESS_STATS );
Debido a que un esbozo tiene compresión con pérdida de los datos originales, ingresa un error estadístico que se representa con un límite de error o un intervalo de confianza (CI). Para la mayoría de las aplicaciones, esta incertidumbre es pequeña. Por ejemplo, un esbozo típico de recuento de cardinalidad tiene un error relativo de alrededor del 1% en el 95% de todos los casos. Un esbozo intercambia cierta exactitud o precisión por cálculos más rápidos y menos costosos, y menos almacenamiento.
En resumen, un esbozo tiene las siguientes propiedades principales:
- Representa una agregación aproximada para una métrica específica
- Es compacto
- Es una forma serializada de una estructura de datos sublineal en memoria
- Tiene, por lo general, un tamaño fijo y es asintóticamente más pequeño que la entrada
- Puede introducir un error estadístico que se determina con un nivel de precisión
- Se puede combinar con otros esbozos para resumir la unión de los conjuntos de datos subyacentes
Vuelve a agregar con la combinación de esbozos
Los esbozos te permiten almacenar y combinar datos para obtener una agregación eficiente. Esto hace que los esbozos sean muy útiles para almacenar resúmenes calculados previamente de conjuntos de datos, conocidos como vistas materializadas. Puedes combinar los esbozos para elaborar un resumen de varios flujos de datos basados en esbozos parciales creados para cada flujo.
Por ejemplo, si creas un esbozo para la cantidad estimada de usuarios distintos por día y, luego, combinas los esbozos diarios, puedes obtener la cantidad de usuarios distintos durante los últimos siete días. Volver a agregar los esbozos diarios combinados te ayuda a evitar leer la entrada completa del conjunto de datos.
La agregación de esbozos también es útil en el procesamiento analítico en línea (OLAP). Puedes combinar los esbozos para crear un resumen de un cubo de OLAP, en el que el esbozo resume los datos en una o más dimensiones específicas del cubo. Las agregaciones de OLAP no son posibles con recuentos distintos verdaderos.
¿Qué tipo de boceto debo usar?
Se diseñan diferentes algoritmos de esbozos para diferentes tipos de métricas, como HLL++ para recuentos distintos y KLL para cuantiles. GoogleSQL también proporciona funciones de agregación aproximadas que puedes usar para consultar estos tipos de datos sin tener que especificar detalles de la consulta, como el nivel de precisión.
El boceto que uses dependerá del tipo de datos que necesites estimar.
Estima la cardinalidad
Si necesitas estimar la cardinalidad, usa un esbozo de HLL++.
Por ejemplo, para obtener la cantidad de usuarios únicos que usaron de forma activa un producto en un mes determinado (métricas de MAU o 28DAU), usa un esbozo de HLL++.
Calcula un cuantil
Si necesitas obtener un cuantil de un conjunto de datos, usa un esquema de KLL.
Por ejemplo, para obtener la mediana de la duración de las visitas de los clientes en una tienda o para hacer un seguimiento de la latencia del percentil 95 en la que los tickets permanecen en una cola antes de que se aborden, usa un esbozo de KLL.
Esbozos de HLL++
HyperLogLog++ (HLL++) es un algoritmo de esbozos para estimar la cardinalidad. HLL++ se basa en el documento HyperLogLog en la práctica, en el que ++ denota los aumentos realizados al algoritmo HyperLogLog.
La cardinalidad es el número de elementos distintos en la entrada de un esbozo. Por ejemplo, puedes usar un esbozo de HLL++ para obtener la cantidad de usuarios únicos que abrieron una aplicación.
HLL++ estima cardinalidades muy pequeñas y muy grandes. HLL++ incluye una función hash de 64 bits, una representación dispersa que reduce los requisitos de memoria para las estimaciones de cardinalidad pequeña y una corrección del sesgo empírico en las estimaciones de cardinalidad pequeñas.
Precisión
Los esbozos de HLL++ admiten la precisión personalizada. En la siguiente tabla, se muestran los valores de precisión admitidos, el tamaño máximo de almacenamiento y el intervalo de confianza (CI) de los niveles de precisión típicos:
| Precisión | Tamaño máximo de almacenamiento | CI del 65% | CI del 95% | IC 99% |
|---|---|---|---|---|
| 10 | 1 KiB + 28 B | ±3.25% | ±6.50% | ±9.75% |
| 11 | 2 KiB + 28 B | ±2.30% | ±4.60% | ±6.89% |
| 12 | 4 KiB + 28 B | ±1.63% | ±3.25% | ±4.88% |
| 13 | 8 KiB + 28 B | ±1.15% | ±2.30% | ±3.45% |
| 14 | 16 KiB + 30 B | ±0.81% | ±1.63% | ±2.44% |
| 15 (predeterminada) | 32 KiB + 30 B | ±0.57% | ±1.15% | ±1.72% |
| 16 | 64 KiB + 30 B | ±0.41% | ±0.81% | ±1.22% |
| 17 | 128 KiB + 30 B | ±0.29% | ±0.57% | ±0.86% |
| 18 | 256 KiB + 30 B | ±0.20% | ±0.41% | ±0.61% |
| 19 | 512 KiB + 30 B | ±0.14% | ±0.29% | ±0.43% |
| 20 | 1,024 KiB + 30 B | ±0.10% | ±0.20% | ±0.30% |
| 21 | 2,048 KiB y 32 B | ±0.07% | ±0.14% | ±0.22% |
| 22 | 4,096 KiB + 32 B | ±0.05% | ±0.10% | ±0.15% |
| 23 | 8,192 KiB y 32 B | ±0.04% | ±0.07% | ±0.11% |
| 24 | 16,384 KiB + 32 B | ±0.03% | ±0.05% | ±0.08% |
Puedes definir la precisión de un esbozo de HLL++ cuando lo inicializas con la función HLL_COUNT.INIT.
Eliminación
No puedes borrar los valores de un esbozo de HLL++.
Detalles adicionales
Para obtener la lista de funciones que puedes usar con los esbozos de HLL++, consulta Funciones de HLL++.
Integración de esbozos
Puedes integrar esbozos de HLL++ en otros sistemas. Por ejemplo, puedes compilar esbozos en aplicaciones externas, como Dataflow, Apache Spark y ZetaSketch, y, luego, consumirlos en GoogleSQL o viceversa.
Además de GoogleSQL, puedes usar esbozos de HLL++ con Java.
Esbozos de KLL
KLL (abreviatura de Karnin-Lang-Liberty) es un algoritmo de transmisión para calcular esbozos de cuantiles aproximados. Calcula cuantiles arbitrarios de forma mucho más eficiente que los cálculos exactos, con un pequeño error de aproximación.
Precisión
Los esbozos de KLL admiten la precisión personalizada. La precisión define la exactitud de un cuantil aproximado q que se muestra.
De forma predeterminada, el rango de un cuantil aproximado puede estar, como máximo, a una distancia de ±1/1000 * n
de ⌈Φ * n⌉, en el que n es la cantidad de filas en la entrada y ⌈Φ * n⌉ es
el rango del cuantil exacto.
Si proporcionas una precisión personalizada, el rango del cuantil aproximado puede ser,
como máximo, ±1/precision * n diferente del rango del cuantil exacto. El error
se encuentra dentro de este límite de error en el 99.999% de los casos. Esta garantía de error solo se aplica a la diferencia entre las clasificaciones exactas y aproximadas. La diferencia numérica
entre el valor exacto y el aproximado para un cuantil puede ser
arbitrariamente grande.
Por ejemplo, supongamos que deseas encontrar el valor de la mediana, Φ = 0.5, y usas
la precisión predeterminada de 1000. Luego, la clasificación del valor que muestra la función KLL_QUANTILES.EXTRACT_POINT difiere de la clasificación verdadera en, como máximo, n/1000 en el 99.999% de los casos. En otras palabras, el valor que se muestra casi siempre se encuentra entre los percentiles 49.9 y 50.1. Si tienes 1,000,000 de elementos en
tu boceto, el rango de la mediana que se muestra casi siempre está entre
499,000 y 501,000.
Si usas una precisión personalizada de 100 para encontrar el valor de la mediana, la clasificación
del valor que muestra la función KLL_QUANTILES.EXTRACT_POINT difiere de
la clasificación verdadera en un máximo de n/100 en el 99.999% de los casos. En otras palabras, el valor que se muestra casi siempre se encuentra entre los percentiles 49 y 51. Si
tienes 1,000,000 de elementos en tu bosquejo, el rango de la mediana que se muestra es
casi siempre entre 490,000 y 510,000.
Puedes definir la precisión de un esbozo de KLL cuando lo inicializas con la
función KLL_QUANTILES.INIT.
Tamaño
El tamaño del boceto de KLL depende del parámetro de precisión y del tipo de entrada.
Si tu tipo de entrada es INT64, los bocetos pueden usar una optimización adicional
que es especialmente útil si los valores de entrada provienen de un universo pequeño. La
siguiente tabla contiene dos columnas para INT64. Una columna proporciona un
límite superior en el tamaño del boceto para los elementos de un universo limitado de tamaño 1B, y una
segunda columna proporciona un límite superior para los valores de entrada arbitrarios.
| Precisión | FLOAT64 | INT64 (<1B) | INT64 (cualquiera) |
|---|---|---|---|
| 10 | 761 B | 360 B | 717 B |
| 20 | 1.46 KB | 706 B | 1.47 KB |
| 50 | 3.49 KB | 1.72 KB | 3.60 KB |
| 100 | 6.94 KB | 3.44 KB | 7.12 KB |
| 200 | 13.87 KB | 6.33 KB | 13.98 KB |
| 500 | 35.15 KB | 14.47 KB | 35.30 KB |
| 1000 | 71.18 KB | 27.86 KB | 71.28 KB |
| 2000 | 144.51 KB | 55.25 KB | 144.57 KB |
| 5000 | 368.87 KB | 139.54 KB | 368.96 KB |
| 10000 | 749.82 KB | 282.27 KB | 697.80 KB |
| 20000 | 1.52 MB | 573.16 KB | 1.37 MB |
| 50,000 | 3.90 MB | 1.12 MB | 3.45 MB |
| 100000 | 7.92 MB | 2.18 MB | 6.97 MB |
Phi
Phi (Φ) representa el cuantil que se producirá como una fracción de la cantidad total de filas en la entrada del boceto, normalizada entre 0 y 1. Si una función admite phi, la función devuelve un valor v de modo que aproximadamente Φ * n entradas sean menores o iguales que v, y (1-Φ) * n entradas sean mayores o iguales que v.
Detalles adicionales
Para obtener una lista de las funciones que puedes usar con los esbozos de KLL, consulta Funciones de cuantiles de KLL.
El algoritmo KLL se define en el artículo
Optimal Quantile Approximation in Streams y se llama así
por sus autores, Karnin, Lang y Liberty, que publicaron el artículo en 2016.
El algoritmo KLL mejora el algoritmo MP80 anterior, ya que usa búferes de tamaño variable para reducir el uso de memoria en conjuntos de datos grandes, lo que reduce el tamaño del boceto de O(log n) a O(1). Debido a la naturaleza no determinística del algoritmo, es posible que los bocetos creados
en el mismo conjunto de datos con la misma precisión no sean idénticos.
Cuantiles
Los cuantiles son puntos de corte que dividen el rango de una distribución de probabilidad en intervalos continuos con probabilidades iguales o que dividen las observaciones de una muestra de la misma manera. Un boceto que admite cuantiles te permite estimar cuantiles resumiendo esos intervalos y probabilidades en resultados de cuantiles casi exactos.
Por lo general, los cuantiles se definen de dos maneras:
Para un número entero positivo
q, los cuantilesqson un conjunto de valores que dividen un conjunto de entrada en subconjuntosqde tamaño casi igual. Algunos de estos tienen nombres específicos: el 2-cuantil único es la mediana, los 4-cuantiles son cuartiles, los 100-cuantiles son percentiles, etc. Las funciones de KLL también devuelven el mínimo (exacto) y el máximo de la entrada, por lo que, cuando se consulta por los 2-cuantiles, se devuelven tres valores.Como alternativa, los cuantiles se pueden considerar
Φ-cuantiles individuales, en los queΦes un número real con0 <= Φ <= 1. El cuantilΦxes un elemento de la entrada, de modo que una fracciónΦde la entrada es menor o igual quex, y una fracción(1-Φ)es mayor o igual quex. En esta notación, la mediana es el cuantil 0.5 y el percentil 95 es el cuantil 0.95.
Por ejemplo, puedes usar un esbozo que admita cuantiles para obtener la mediana de la cantidad de veces que los usuarios abren una aplicación.
Funciones de agregación aproximada
Como alternativa a funciones de aproximación específicas basadas en esbozos, GoogleSQL proporciona funciones de agregación aproximada predefinidas. Estas funciones de agregación aproximada admiten esbozos para estimaciones comunes, como recuento distinto, cuantiles y recuento superior, pero no admiten la precisión personalizada. Tampoco exponen ni almacenan el esbozo para su agregación, como otros tipos de esbozos. Las funciones de agregación aproximadas están diseñadas para ejecutar consultas rápidas basadas en esbozos sin una configuración detallada.
Para obtener una lista de las funciones de agregación aproximada que puedes usar con la aproximación basada en esbozos, consulta Funciones de agregación aproximada.