Amostras da tabela

Com a amostragem de tabelas, é possível consultar subconjuntos aleatórios de dados de grandes tabelas do BigQuery. A amostragem retorna vários registros, ao mesmo tempo que evita os custos associados com a verificação e o processamento de uma tabela inteira.

Como usar a amostragem de tabelas

Para usar a amostragem de tabelas em uma consulta, inclua a cláusula TABLESAMPLE. Por exemplo, a consulta a seguir 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 retorna um subconjunto aleatório de dados de uma tabela. Além disso, o BigQuery não armazena em cache os resultados das consultas que incluem uma cláusula TABLESAMPLE. Portanto, a consulta pode retornar resultados diferentes a cada vez.

É possível combinar a cláusula TABLESAMPLE com outras condições de seleção. O exemplo a seguir coleta 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 próximo exemplo combina uma cláusula TABLESAMPLE com uma JOIN:

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

Para tabelas menores, se você mesclar duas amostras e nenhuma das linhas de amostra atender à condição de mesclagem, poderá receber um resultado vazio.

É possível especificar a porcentagem como um parâmetro de consulta. No próximo exemplo, mostramos como transmitir a porcentagem para uma consulta usando a ferramenta de linha 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 são organizadas em blocos de dados. A cláusula TABLESAMPLE funciona aleatoriamente selecionando uma porcentagem de blocos de dados da tabela e lendo todas as linhas nos blocos selecionados. A granularidade de amostragem é limitada pelo número de blocos de dados.

Normalmente, o BigQuery divide tabelas ou suas partições em blocos se elas forem maiores que cerca de 1 GB. Tabelas menores podem consistir em um único bloco de dados. Nesse caso, a cláusula TABLESAMPLE lê a tabela inteira. Se a porcentagem de amostragem for maior que zero e a tabela não estiver vazia, a amostragem da tabela sempre retornará alguns resultados.

Os blocos podem ser de tamanhos diferentes. Assim, a fração exata de linhas amostradas pode variar. Se você quiser testar linhas individuais, em vez de blocos de dados, use uma cláusula WHERE rand() < K. No entanto, essa abordagem exige que o BigQuery verifique a tabela inteira. Para economizar custos sem deixar de aproveitar a amostragem no nível da linha, combine as duas técnicas.

O exemplo a seguir lê aproximadamente 20% dos blocos de dados do armazenamento e seleciona aleatoriamente 10% das linhas nesses blocos:

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

Tabelas externas

É possível usar a cláusula TABLESAMPLE com tabelas externas que armazenam dados em um conjunto de arquivos. O BigQuery analisa um subconjunto dos arquivos externos referenciados pela tabela. Para alguns formatos de arquivo, o BigQuery pode dividir arquivos individuais em blocos para a amostragem. Alguns dados externos, como as informações no Planilhas, consistem em um único arquivo amostrado como um bloco de dados.

Amostragem do armazenamento otimizado para gravação

Se você usar amostragem de tabela com inserções por streaming, o BigQuery coletará dados do armazenamento otimizado para gravação. Em alguns casos, todos os dados no armazenamento otimizado para gravação são representados como um bloco único. Quando isso acontece, ou aparecem nos resultados todos os dados no armazenamento otimizado para gravação, ou nenhum.

Tabelas particionadas e em cluster

O particionamento e o armazenamento em cluster produzem blocos em que todas as linhas de um bloco específico têm a mesma chave de particionamento ou têm atributos de cluster com valores próximos. Portanto, os conjuntos de amostra dessas tabelas tendem a ter mais viés do que os conjuntos de amostra de tabelas não particionadas.

Limitações

  • Uma tabela amostrada pode aparecer apenas uma vez em uma instrução de consulta. Essa restrição inclui tabelas referenciadas nas definições da visualização.
  • A amostragem de dados das visualizações não é compatível.
  • A amostragem dos resultados de subconsultas ou chamadas de função com valores de tabela não é aceita.
  • Não é possível fazer amostragem de uma varredura de matriz, como o resultado de chamar o operador UNNEST.
  • A amostragem em uma subconsulta IN não é aceita.
  • Não é possível fazer a amostragem de tabelas com segurança aplicada no nível da linha.

Preços de amostragem da tabela

Se você usar o faturamento sob demanda, será cobrado pela leitura dos dados amostrados. O BigQuery não armazena em cache os resultados de uma consulta que inclui uma cláusula TABLESAMPLE. Portanto, cada execução gera um custo de leitura dos dados do armazenamento.