Amostragem de tabelas

A amostragem de tabelas permite-lhe consultar subconjuntos aleatórios de dados de tabelas grandes do BigQuery. A amostragem devolve uma variedade de registos, evitando os custos associados à análise e ao processamento de uma tabela inteira.

Usar a amostragem de tabelas

Para usar a amostragem de tabelas numa consulta, inclua a cláusula TABLESAMPLE. Por exemplo, a seguinte consulta seleciona aproximadamente 10% dos dados de uma tabela:

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

Ao contrário da cláusula LIMIT, TABLESAMPLE devolve um subconjunto aleatório de dados de uma tabela. Além disso, o BigQuery não armazena em cache os resultados de consultas que incluem uma cláusula TABLESAMPLE, pelo que a consulta pode devolver resultados diferentes de cada vez.

Pode combinar a cláusula TABLESAMPLE com outras condições de seleção. O exemplo seguinte faz uma amostragem de cerca de 50% da tabela e, em seguida, aplica uma cláusula WHERE:

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

O exemplo seguinte combina uma cláusula TABLESAMPLE com uma cláusula JOIN:

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

Para tabelas mais pequenas, se unir duas amostras e nenhuma das linhas com amostragem cumprir a condição de união, pode receber um resultado vazio.

Pode especificar a percentagem como um parâmetro de consulta. O exemplo seguinte mostra como transmitir a percentagem a uma consulta através da ferramenta de linhas de comando bq:

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

As tabelas do BigQuery estão organizadas em blocos de dados. A cláusula TABLESAMPLE funciona selecionando aleatoriamente uma percentagem de blocos de dados da tabela e lendo todas as linhas nos blocos selecionados. A granularidade da amostragem é limitada pelo número de blocos de dados.

Normalmente, o BigQuery divide as tabelas ou as partições de tabelas em blocos se forem superiores a cerca de 1 GB. As tabelas mais pequenas podem consistir num único bloco de dados. Nesse caso, a cláusula TABLESAMPLE lê a tabela inteira. Se a percentagem de amostragem for superior a zero e a tabela não estiver vazia, a amostragem de tabelas devolve sempre alguns resultados.

Os blocos podem ter tamanhos diferentes, pelo que a fração exata de linhas que são amostradas pode variar. Se quiser criar amostras de linhas individuais, em vez de blocos de dados, pode usar uma cláusula WHERE rand() < K. No entanto, esta abordagem requer que o BigQuery analise toda a tabela. Para poupar custos, mas continuar a beneficiar da amostragem ao nível da linha, pode combinar ambas as técnicas.

O exemplo seguinte lê aproximadamente 20% dos blocos de dados do armazenamento e, em seguida, seleciona aleatoriamente 10% das linhas nesses blocos:

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

Tabelas externas

Pode usar a cláusula TABLESAMPLE com tabelas externas que armazenam dados numa coleção de ficheiros. O BigQuery extrai uma amostra de um subconjunto dos ficheiros externos aos quais a tabela faz referência. Para alguns formatos de ficheiros, o BigQuery pode dividir ficheiros individuais em blocos para amostragem. Alguns dados externos, como os dados no Google Sheets, consistem num único ficheiro que é amostrado como um bloco de dados.

Amostragem do armazenamento otimizado para escrita

Se usar a amostragem de tabelas com inserções por stream, o BigQuery amostra dados do armazenamento otimizado para escrita. Em alguns casos, todos os dados no armazenamento otimizado para gravação são representados como um único bloco. Quando isso acontece, todos os dados no armazenamento otimizado para gravação aparecem nos resultados ou nenhum deles aparece.

Tabelas particionadas e agrupadas

A partição e o clustering produzem blocos em que todas as linhas num bloco específico têm a mesma chave de partição ou têm atributos de clustering com valores próximos. Por conseguinte, os conjuntos de amostras destas tabelas tendem a ser mais enviesados do que os conjuntos de amostras de tabelas não particionadas e não agrupadas.

Limitações

  • Uma tabela com amostragem só pode aparecer uma vez numa declaração de consulta. Esta restrição inclui tabelas referenciadas em definições de vistas.
  • A amostragem de dados de visualizações não é suportada.
  • A amostragem dos resultados de subconsultas ou chamadas de funções de valor de tabela não é suportada.
  • A amostragem a partir de uma análise de matriz, como o resultado da chamada do operador UNNEST, não é suportada.
  • A amostragem numa subconsulta IN não é suportada.
  • A amostragem de tabelas com segurança ao nível das linhas aplicada não é suportada.

Preços de amostragem de tabelas

Se usar a faturação a pedido, é-lhe cobrado o custo da leitura dos dados que são alvo de amostragem. O BigQuery não coloca em cache os resultados de uma consulta que inclua uma cláusula TABLESAMPLE, pelo que cada execução incorre no custo de leitura dos dados do armazenamento.