Esbozos

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 no se sabe cuántos usuarios usaron ambos productos en la tabla. Del mismo modo, no es posible calcular la mediana de 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, la siguiente consulta usa HLL++ y KLL esbozos para estimar los usuarios distintos y la mediana de duración de las visitas de 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 mediante 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 las vistas materializadas de los conjuntos de datos. Puedes combinar los esbozos a fin de 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 esbozo debo usar?

Se diseñaron 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 aproximada que puedes usar para consultar estos tipos de datos sin tener que especificar detalles de la consulta, como el nivel de precisión.

El esbozo que uses depende 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 esbozo de KLL.

Por ejemplo, para obtener la mediana de duración de las visitas de los clientes en una tienda o para hacer un seguimiento de la latencia del percentil 95 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 (IC) de los niveles de precisión típicos:

Precisión Tamaño máximo de almacenamiento IC 65% IC 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 cuantilesaproximados. Calcula cuantiles arbitrarios de manera mucho más eficiente que los cálculos exactos a cambio de 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 ser de ±1/1000 * n de ⌈Φ * n⌉ como máximo, 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 de ±1/precision * n del rango del cuantil exacto como máximo. El error está 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 los rangos exactos y aproximados. La diferencia numérica entre el valor exacto y aproximado de un cuantil puede ser arbitrariamente grande.

Por ejemplo, supongamos que deseas encontrar el valor medio, Φ = 0.5, y usas la precisión predeterminada de 1000. Luego, el rango del valor que muestra la función KLL_QUANTILES.EXTRACT_POINT difiere del rango verdadero en n/1000 como máximo en el 99.999% de los casos. En otras palabras, el valor que se muestra casi siempre está entre los percentiles 49.9 y 50.1. Si tienes 1,000,000 de elementos en tu esbozo, 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 medio, el rango del valor que muestra la función KLL_QUANTILES.EXTRACT_POINT difiere de el rango verdadero en n/100 como máximo en el 99.999% de los casos. En otras palabras, el valor que se muestra casi siempre está entre los percentiles 49 y 51. Si tienes 1,000,000 de elementos en tu esbozo, el rango de la mediana que se muestra casi siempre está entre 490,000 y 510,000.

Puedes definir la precisión de un esbozo de KLL cuando lo inicializas con la KLL_QUANTILES.INIT función.

Tamaño

El tamaño del esbozo de KLL depende del parámetro de precisión y del tipo de entrada. Si tu tipo de entrada es INT64, los esbozos 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 esbozo 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
50000 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 esbozo, normalizada entre 0 y 1. Si una función admite phi, la función muestra 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 cuantil de KLL.

El algoritmo de KLL se define en el documento Optimal Quantile Approximation in Streams y lleva el nombre de sus autores, Karnin, Lang y Liberty, quienes publicaron el documento en 2016. El algoritmo de KLL mejora el algoritmo MP80 anterior mediante el uso de búferes de tamaño variable para reducir el uso de memoria para conjuntos de datos grandes, lo que reduce el tamaño del esbozo de O(log n) a O(1). Debido a la naturaleza no determinista del algoritmo, es posible que los esbozos 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 en una muestra de la misma manera. Un esbozo 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 q-cuantiles son un conjunto de valores que dividen un conjunto de entrada en q subconjuntos de tamaño casi igual. Algunos de ellos tienen nombres específicos: el único 2-cuantil es la mediana, los 4-cuantiles son cuartiles, los 100-cuantiles son percentiles, etcétera. Además, las funciones de KLL muestran el mínimo (exacto) y el máximo de la entrada, por lo que, cuando se consulta por los 2-cuantiles, se muestran tres valores.

  • Como alternativa, los cuantiles se pueden considerar Φ-cuantiles individuales, donde Φ es un número real con 0 <= Φ <= 1. El Φ-cuantil x es un elemento de la entrada de modo que una fracción Φ de la entrada sea menor o igual que x, y una fracción (1-Φ) sea mayor o igual que x. En esta notación, la mediana es el 0.5-cuantil y el percentil 95 es el 0.95-cuantil.

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.