Muestrear tablas

El muestreo de tablas te permite consultar subconjuntos aleatorios de datos de grandes tablas de BigQuery. El muestreo devuelve una variedad de registros y evita los costes asociados al análisis y procesamiento de una tabla completa.

Usar el muestreo de tablas

Para usar el muestreo de tablas en una consulta, incluye la cláusula TABLESAMPLE. Por ejemplo, la siguiente consulta selecciona aproximadamente el 10% de los datos de una tabla:

SELECT * FROM dataset.my_table TABLESAMPLE SYSTEM (10 PERCENT)

A diferencia de la cláusula LIMIT, TABLESAMPLE devuelve un subconjunto aleatorio de datos de una tabla. Además, BigQuery no almacena en caché los resultados de las consultas que incluyen una cláusula TABLESAMPLE, por lo que la consulta puede devolver resultados diferentes cada vez.

Puedes combinar la cláusula TABLESAMPLE con otras condiciones de selección. En el siguiente ejemplo se muestrea aproximadamente el 50% de la tabla y, a continuación, se aplica una cláusula WHERE:

SELECT *
FROM dataset.my_table TABLESAMPLE SYSTEM (50 PERCENT)
WHERE customer_id = 1

En el siguiente ejemplo se combina una cláusula TABLESAMPLE con una cláusula JOIN:

SELECT *
FROM dataset.table1 T1 TABLESAMPLE SYSTEM (10 PERCENT)
JOIN dataset.table2 T2 TABLESAMPLE SYSTEM (20 PERCENT) USING (customer_id)

En el caso de las tablas más pequeñas, si combinas dos muestras y ninguna de las filas muestreadas cumple la condición de combinación, es posible que obtengas un resultado vacío.

Puede especificar el porcentaje como un parámetro de consulta. En el siguiente ejemplo se muestra cómo enviar el porcentaje a una consulta mediante la herramienta de línea de comandos bq:

bq query --use_legacy_sql=false --parameter=percent:INT64:29 \
    'SELECT * FROM `dataset.my_table` TABLESAMPLE SYSTEM (@percent PERCENT)`

Las tablas de BigQuery se organizan en bloques de datos. La cláusula TABLESAMPLE selecciona aleatoriamente un porcentaje de bloques de datos de la tabla y lee todas las filas de los bloques seleccionados. La granularidad del muestreo está limitada por el número de bloques de datos.

Normalmente, BigQuery divide las tablas o las particiones de tablas en bloques si superan 1 GB. Las tablas más pequeñas pueden constar de un solo bloque de datos. En ese caso, la cláusula TABLESAMPLE lee toda la tabla. Si el porcentaje de muestreo es mayor que cero y la tabla no está vacía, el muestreo de la tabla siempre devuelve algunos resultados.

Los bloques pueden tener tamaños diferentes, por lo que la fracción exacta de filas muestreadas puede variar. Si quieres muestrear filas individuales en lugar de bloques de datos, puedes usar una cláusula WHERE rand() < K. Sin embargo, este método requiere que BigQuery analice toda la tabla. Para ahorrar costes y, al mismo tiempo, aprovechar las ventajas del muestreo a nivel de fila, puedes combinar ambas técnicas.

En el siguiente ejemplo se lee aproximadamente el 20% de los bloques de datos del almacenamiento y, a continuación, se selecciona aleatoriamente el 10% de las filas de esos bloques:

SELECT * FROM dataset.my_table TABLESAMPLE SYSTEM (20 PERCENT)
WHERE rand() < 0.1

Tablas externas

Puedes usar la cláusula TABLESAMPLE con tablas externas que almacenan datos en una colección de archivos. BigQuery toma una muestra de un subconjunto de los archivos externos a los que hace referencia la tabla. En algunos formatos de archivo, BigQuery puede dividir archivos individuales en bloques para tomar muestras. Algunos datos externos, como los datos de Hojas de cálculo de Google, constan de un solo archivo que se muestrea como un bloque de datos.

Muestreo del almacenamiento optimizado para escritura

Si usas el muestreo de tablas con inserciones de streaming, BigQuery muestrea los datos del almacenamiento optimizado para escritura. En algunos casos, todos los datos del almacenamiento optimizado para escritura se representan como un solo bloque. Cuando esto ocurre, se muestran todos los datos del almacenamiento optimizado para escritura en los resultados o no se muestra ninguno.

Tablas con particiones y agrupadas en clústeres

La partición y la agrupación en clústeres producen bloques en los que todas las filas de un bloque específico tienen la misma clave de partición o atributos de clúster con valores similares. Por lo tanto, los conjuntos de muestras de estas tablas suelen estar más sesgados que los conjuntos de muestras de tablas sin particiones ni clústeres.

Limitaciones

  • Una tabla muestreada solo puede aparecer una vez en una instrucción de consulta. Esta restricción incluye las tablas a las que se hace referencia en las definiciones de vistas.
  • No se admite el muestreo de datos de vistas.
  • No se admite el muestreo de los resultados de subconsultas ni de llamadas a funciones con valores de tabla.
  • No se admite el muestreo de un análisis de matriz, como el resultado de llamar al operador UNNEST.
  • No se admite el muestreo en una subconsulta IN.
  • No se admite el muestreo de tablas con seguridad a nivel de fila.

Precios del muestreo de tablas

Si usas la facturación bajo demanda, se te cobrará por leer los datos muestreados. BigQuery no almacena en caché los resultados de una consulta que incluye una cláusula TABLESAMPLE, por lo que cada ejecución conlleva el coste de leer los datos del almacenamiento.