Muestreo de tabla
El muestreo de tabla te permite consultar subconjuntos aleatorios de datos desde tablas de BigQuery grandes. En el ejemplo, se muestra una variedad de registros y se evitan los costos asociados con el análisis y el procesamiento de una tabla completa.
Usa 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
muestra 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 podría mostrar resultados diferentes cada vez.
Puedes combinar la cláusula TABLESAMPLE
con otras condiciones de selección. En el ejemplo siguiente, se muestra alrededor del 50% de la tabla y, luego, 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 unes dos muestras y ninguna de las filas muestreadas cumple con la condición de unión, es posible que se muestre un resultado vacío.
Puedes especificar el porcentaje como un parámetro de búsqueda. En el siguiente ejemplo, se muestra cómo pasar el porcentaje a una consulta con la herramienta de línea de comandos de bq:
bq query --use_legacy_sql=false --parameter=percent:INT64:29 \
'SELECT * FROM `dataset.my_table` TABLESAMPLE SYSTEM (@percent PERCENT)`
Las tablas de BigQuery están organizadas en bloques de datos. La cláusula TABLESAMPLE
funciona mediante la selección aleatoria de un porcentaje de bloques de datos de la tabla y la lectura de todas las filas en los bloques seleccionados. El nivel de detalle de muestreo está limitado por la cantidad de bloques de datos.
Por lo general, BigQuery divide las tablas o las particiones de tablas en bloques si son superiores a aproximadamente 1 GB. Las tablas más pequeñas pueden consistir en un solo bloque de datos. En ese caso, la cláusula TABLESAMPLE
lee la tabla completa. Si el porcentaje de muestreo es mayor que cero y la tabla no está vacía, el muestreo de tablas siempre muestra algunos resultados.
Los bloques pueden ser de diferentes tamaños, por lo que la fracción exacta de filas que se muestrean puede variar. Si quieres muestrear filas individuales, en lugar de bloques de datos, puedes usar una cláusula WHERE rand() < K
en su lugar. Sin embargo, este enfoque requiere que BigQuery analice la tabla completa. Para ahorrar costos y, al mismo tiempo, beneficiarte 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, luego, se selecciona de manera aleatoria 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 almacenen datos en una colección de archivos. BigQuery muestra un subconjunto de los archivos externos a los que hace referencia la tabla. Para algunos formatos de archivo, BigQuery puede dividir archivos individuales en bloques para muestreo. Algunos datos externos, como los datos en Hojas de cálculo de Google, consisten en 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 transmisión, 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 eso sucede, todos los datos del almacenamiento optimizado para escritura aparecen en los resultados o ninguno de ellos aparece.
Tablas particionadas y agrupadas en clústeres
La partición y el agrupamiento en clústeres producen bloques en los que todas las filas dentro de un bloque específico tienen la misma clave de partición o tienen atributos de agrupamiento en clústeres con valores cercanos. Por lo tanto, los conjuntos de muestra de estas tablas tienden a ser más sesgados que los conjuntos de muestra de las tablas no particionadas y no agrupadas.
Limitaciones
- Una tabla de muestra solo puede aparecer una vez en una instrucción de consulta. Esta restricción incluye tablas a las que se hace referencia dentro de las definiciones de vistas.
- No se admiten muestreos de datos de vistas.
- No se admite el muestreo de los resultados de las subconsultas o las llamadas a funciones con valores de tabla.
- No se admite el muestreo de un análisis de array, como el resultado de llamar al operador
UNNEST
. - No se admite el muestreo dentro de una subconsulta
IN
. - No se admite el muestreo de tablas con seguridad a nivel de fila aplicada.
Precios del muestreo de tablas
Si usas la facturación a pedido, se te cobra por leer los datos que se muestrean. BigQuery no almacena en caché los resultados de una consulta que incluye una cláusula TABLESAMPLE
, por lo que cada ejecución genera el costo de lectura de los datos desde el almacenamiento.