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 duración mediana de la visita 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 esbozos de HLL++ y KLL para estimar los usuarios distintos y la duración media de la visita para 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 (IC). 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 boceto debo usar?

Se diseñan diferentes algoritmos de esbozo 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 boceto de KLL.

Por ejemplo, para obtener la duración mediana de las visitas de los clientes en una tienda o hacer un seguimiento de la latencia del percentil 95 que los tickets permanecen en una cola antes de que se aborden, usa un boceto 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 los 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 bocetos de cuantiles aproximados. Calcula cuantiles arbitrarios de forma mucho más eficiente que los cálculos exactos, a cambio de un pequeño error de aproximación.

Precisión

Los resúmenes de KLL admiten la precisión personalizada. La precisión define la exactitud de un cuantil aproximado q que se devuelve.

De forma predeterminada, la clasificación de un cuantil aproximado puede diferir como máximo en ±1/1000 * n de ⌈Φ * n⌉, donde n es la cantidad de filas en la entrada y ⌈Φ * n⌉ es la clasificación del cuantil exacto.

Si proporcionas una precisión personalizada, la clasificación del cuantil aproximado puede diferir como máximo en ±1/precision * n de la clasificación 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 los rangos exactos y los aproximados. 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 real en un máximo de n/1000 en el 99.999% de los casos. En otras palabras, el valor devuelto 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 devuelta casi siempre estará entre 499,000 y 501,000.

Si usas una precisión personalizada de 100 para encontrar el valor de la mediana, el rango del valor que devuelve la función KLL_QUANTILES.EXTRACT_POINT difiere del rango verdadero en un máximo de n/100 en el 99.999% de los casos. En otras palabras, el valor devuelto casi siempre se encuentra entre los percentiles 49 y 51. Si tienes 1,000,000 de elementos en tu boceto, el rango de la mediana devuelta casi siempre está 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 para el tamaño del boceto de elementos de un universo limitado de tamaño 1 mil millones, y una segunda columna proporciona un límite superior para valores de entrada arbitrarios.

Precisión FLOAT64 INT64 (menos de 1 mil millones) INT64 (cualquier valor)
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 los datos de entrada del boceto, normalizado entre 0 y 1. Si una función admite phi, devuelve un valor v tal que aproximadamente Φ * n entradas son menores o iguales que v, y (1-Φ) * n entradas son 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 documento Optimal Quantile Approximation in Streams y lleva el nombre de sus autores, Karnin, Lang y Liberty, quienes lo publicaron 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 determinista del algoritmo, es posible que los bocetos creados con el mismo conjunto de datos y 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 compatible con los cuantiles te permite estimar los 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 particionan un conjunto de entrada en q subconjuntos de tamaño casi igual. Algunos de estos tienen nombres específicos: el único 2-cuantil es la mediana, los 4-cuantiles son cuartiles, los 100-cuantiles son percentiles, etcétera. Las funciones de KLL también devuelven el mínimo y el máximo (exactos) de la entrada, por lo que, cuando se consulta por los 2-cuantiles, se devuelven tres valores.

  • Como alternativa, los cuantiles se pueden considerar como cuantiles Φ individuales, donde Φ es un número real con 0 <= Φ <= 1. El cuantil Φ x es un elemento de la entrada tal que una fracción Φ de la entrada es menor o igual que x, y una fracción (1-Φ) es mayor o igual que x. 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 boceto 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.