Gerir tabelas particionadas

Este documento descreve como gerir tabelas particionadas no BigQuery.

Obtenha metadados de partições

Pode obter informações sobre tabelas particionadas das seguintes formas:

Obter metadados de partições através de vistas INFORMATION_SCHEMA

Quando consulta a vista INFORMATION_SCHEMA.PARTITIONS, os resultados da consulta contêm uma linha para cada partição. Por exemplo, a seguinte consulta lista todas as partições da tabela no conjunto de dados denominado mydataset:

SELECT table_name, partition_id, total_rows
FROM `mydataset.INFORMATION_SCHEMA.PARTITIONS`
WHERE partition_id IS NOT NULL

Para mais informações, consulte INFORMATION_SCHEMA.PARTITIONS.

Obter metadados de partições através de metatabelas

No SQL antigo, pode obter metadados sobre partições de tabelas consultando a meta tabela __PARTITIONS_SUMMARY__. As metatabelas são tabelas só de leitura que contêm metadados.

Consulte a meta tabela __PARTITIONS_SUMMARY__ da seguinte forma:

#legacySQL
SELECT
  column
FROM
  [dataset.table$__PARTITIONS_SUMMARY__]

A metatabela __PARTITIONS_SUMMARY__ tem as seguintes colunas:

Valor Descrição
project_id Nome do projeto.
dataset_id Nome do conjunto de dados.
table_id Nome da tabela particionada por tempo.
partition_id Nome (data) da partição.
creation_time A hora em que a partição foi criada, em milissegundos desde 1 de janeiro de 1970 UTC.
last_modified_time A hora em que a partição foi modificada pela última vez, em milissegundos, desde 1 de janeiro de 1970 UTC.

No mínimo, para executar uma tarefa de consulta que use a meta- tabela __PARTITIONS_SUMMARY__, tem de lhe ser concedidas as autorizações bigquery.jobs.create e bigquery.tables.getData.

Para mais informações sobre as funções de IAM no BigQuery, consulte o artigo Controlo de acesso.

Defina a validade da partição

Quando cria uma tabela particionada por tempo de carregamento ou por coluna de unidade de tempo, pode especificar uma expiração da partição. Esta definição especifica durante quanto tempo o BigQuery mantém os dados em cada partição. A definição aplica-se a todas as partições na tabela, mas é calculada independentemente para cada partição com base na hora da partição.

A hora de expiração de uma partição é calculada a partir do limite da partição em UTC. Por exemplo, com a partição diária, o limite da partição é à meia-noite (00:00:00 UTC). Se a expiração da partição da tabela for de 6 horas, cada partição expira às 06:00:00 UTC do dia seguinte. Quando uma partição expira, o BigQuery elimina os dados nessa partição.

Também pode especificar uma validade da partição predefinida ao nível do conjunto de dados. Se definir a validade da partição numa tabela, o valor substitui a validade da partição predefinida. Se não especificar nenhuma expiração de partição (na tabela ou no conjunto de dados), as partições nunca expiram.

Se definir uma expiração da tabela, esse valor tem precedência sobre a expiração da partição. Por exemplo, se a validade da tabela estiver definida como 5 dias e a validade da partição estiver definida como 7 dias, a tabela e todas as partições na mesma são eliminadas após 5 dias.

Em qualquer altura após a criação de uma tabela, pode atualizar a expiração da partição da tabela. A nova definição aplica-se a todas as partições nessa tabela, independentemente da data em que foram criadas. As partições existentes expiram imediatamente se forem mais antigas do que a nova hora de expiração. Da mesma forma, se os dados estiverem a ser copiados ou inseridos numa tabela particionada por coluna de unidade de tempo, todas as partições mais antigas do que a expiração da partição configurada para a tabela expiram imediatamente.

Quando uma partição expira, o BigQuery elimina-a. Os dados de partição são retidos de acordo com as políticas de time travel e fail-safe e podem ser cobrados em função do seu modelo de faturação. Até lá, as partições são contabilizadas para efeitos de quotas de tabelas. Para eliminar uma partição imediatamente, pode eliminá-la manualmente.

Atualize a validade da partição

Para atualizar a expiração de partições de uma tabela particionada:

Consola

Não pode atualizar a expiração da partição na Trusted Cloud consola.

SQL

Use a declaração ALTER TABLE SET OPTIONS. O exemplo seguinte atualiza a validade para 5 dias. Para remover a validade da partição de uma tabela, defina partition_expiration_days como NULL.

  1. Na Trusted Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No editor de consultas, introduza a seguinte declaração:

    ALTER TABLE mydataset.mytable
      SET OPTIONS (
        -- Sets partition expiration to 5 days
        partition_expiration_days = 5);

  3. Clique em Executar.

Para mais informações sobre como executar consultas, consulte o artigo Execute uma consulta interativa.

bq

Emita o comando bq update com a flag --time_partitioning_expiration. Se estiver a atualizar uma tabela particionada num projeto que não seja o seu projeto predefinido, adicione o ID do projeto ao nome do conjunto de dados no seguinte formato: project_id:dataset.

bq update \
--time_partitioning_expiration integer_in_seconds \
--time_partitioning_type unit_time \
project_id:dataset.table

Onde:

  • integer é o tempo de vida predefinido (em segundos) das partições da tabela. Não existe um valor mínimo. O tempo de expiração é avaliado como a data da partição mais o valor inteiro. Se especificar 0, a expiração da partição é removida e a partição nunca expira. As partições sem data de validade têm de ser eliminadas manualmente.
  • unit_time é DAY, HOUR, MONTH ou YEAR, com base no nível de detalhe da partição da tabela. Este valor tem de corresponder à granularidade que definiu quando criou a tabela.
  • project_id é o ID do seu projeto.
  • dataset é o nome do conjunto de dados que contém a tabela que está a atualizar.
  • table é o nome da tabela que está a atualizar.

Exemplos:

Introduza o seguinte comando para atualizar o tempo de expiração das partições em mydataset.mytable para 5 dias (432 000 segundos). mydataset está no seu projeto predefinido.

bq update --time_partitioning_expiration 432000 mydataset.mytable

Introduza o seguinte comando para atualizar o tempo de expiração das partições em mydataset.mytable para 5 dias (432 000 segundos). mydataset está em myotherproject e não no seu projeto predefinido.

bq update \
--time_partitioning_expiration 432000 \
myotherproject:mydataset.mytable

API

Chame o método tables.patch e use a propriedade timePartitioning.expirationMs para atualizar a validade da partição em milissegundos. Uma vez que o método tables.update substitui o recurso de tabela completo, o método tables.patch é o preferido.

Defina os requisitos do filtro de partição

Quando cria uma tabela particionada, pode exigir que todas as consultas na tabela incluam um filtro de predicado (uma cláusula WHERE) que filtre na coluna de partição. Esta definição pode melhorar o desempenho e reduzir os custos, porque o BigQuery pode usar o filtro para remover partições que não correspondem ao predicado. Este requisito também se aplica a consultas em visualizações e visualizações materializadas que referenciam a tabela particionada.

Para obter informações sobre como adicionar a opção Exigir filtro de partição quando cria uma tabela particionada, consulte o artigo Criar tabelas particionadas.

Se uma tabela particionada tiver a definição Exigir filtro de partição, todas as consultas nessa tabela têm de incluir, pelo menos, um predicado que faça referência apenas à coluna de particionamento. As consultas sem esse predicado devolvem o seguinte erro:

Cannot query over table 'project_id.dataset.table' without a filter that can be used for partition elimination.

Para mais informações, consulte o artigo Consultar tabelas particionadas.

Atualize o requisito do filtro de partição

Se não ativar a opção Exigir filtro de partição quando criar a tabela particionada, pode atualizar a tabela para adicionar a opção.

Consola

Não pode usar a Trusted Cloud consola para exigir filtros de partição depois de criar uma tabela particionada.

SQL

Use a declaração ALTER TABLE SET OPTIONS para atualizar o requisito do filtro de partição. O exemplo seguinte atualiza o requisito para true:

  1. Na Trusted Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No editor de consultas, introduza a seguinte declaração:

    ALTER TABLE mydataset.mypartitionedtable
      SET OPTIONS (
        require_partition_filter = true);

  3. Clique em Executar.

Para mais informações sobre como executar consultas, consulte o artigo Execute uma consulta interativa.

bq

Para atualizar uma tabela particionada de modo a exigir filtros de partição através da ferramenta de linhas de comando bq, introduza o comando bq update e forneça a flag --require_partition_filter.

Para atualizar uma tabela particionada num projeto que não seja o projeto predefinido, adicione o ID do projeto ao conjunto de dados no seguinte formato: project_id:dataset.

Por exemplo:

Para atualizar mypartitionedtable em mydataset no seu projeto predefinido, introduza:

bq update --require_partition_filter mydataset.mytable

Para atualizar mypartitionedtable em mydataset em myotherproject, introduza:

bq update --require_partition_filter myotherproject:mydataset.mytable

API

Chame o método tables.patch e defina a propriedade requirePartitionFilter como true para exigir filtros de partição. Uma vez que o método tables.update substitui todo o recurso de tabela, o método tables.patch é o preferido.

Java

Antes de experimentar este exemplo, siga as Javainstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Java BigQuery documentação de referência.

Para se autenticar no BigQuery, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

Antes de executar exemplos de código, defina a variável GOOGLE_CLOUD_UNIVERSE_DOMAIN environment como s3nsapis.fr.

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.Table;

// Sample to update require partition filter on a table.
public class UpdateTableRequirePartitionFilter {

  public static void runUpdateTableRequirePartitionFilter() {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    updateTableRequirePartitionFilter(datasetName, tableName);
  }

  public static void updateTableRequirePartitionFilter(String datasetName, String tableName) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      Table table = bigquery.getTable(datasetName, tableName);
      table.toBuilder().setRequirePartitionFilter(true).build().update();

      System.out.println("Table require partition filter updated successfully");
    } catch (BigQueryException e) {
      System.out.println("Table require partition filter was not updated \n" + e.toString());
    }
  }
}

Copie uma tabela particionada

O processo de cópia de uma tabela particionada é o mesmo que o processo de cópia de uma tabela padrão. Para mais informações, consulte o artigo Copiar uma tabela.

Quando copia uma tabela particionada, tenha em atenção o seguinte:

  • Copiar uma tabela particionada para uma nova tabela de destino
    Todas as informações de partição são copiadas com a tabela. A nova tabela e a tabela antiga vão ter partições idênticas.
  • Copiar uma tabela não particionada para uma tabela particionada existente
    Esta operação só é suportada para a partição de tempo de carregamento. O BigQuery copia os dados de origem para a partição que representa a data atual. Esta operação não é suportada para tabelas particionadas por colunas de unidades de tempo ou por intervalos de números inteiros.
  • Copiar uma tabela particionada para outra tabela particionada
    As especificações de partição das tabelas de origem e de destino têm de corresponder.
  • Copiar uma tabela particionada para uma tabela não particionada
    A tabela de destino permanece não particionada.
  • Copiar várias tabelas particionadas

    Se copiar várias tabelas de origem para uma tabela particionada na mesma tarefa, as tabelas de origem não podem conter uma combinação de tabelas particionadas e não particionadas.

    Se todas as tabelas de origem forem tabelas particionadas, as especificações de partição de todas as tabelas de origem têm de corresponder à especificação de partição da tabela de destino.

  • Copiar uma tabela particionada que tenha uma especificação de clustering

    Se copiar para uma nova tabela, todas as informações de agrupamento são copiadas com a tabela. A nova tabela e a tabela antiga vão ter um agrupamento idêntico.

    Se copiar para uma tabela existente, as especificações de cluster das tabelas de origem e de destino têm de corresponder.

Quando copia para uma tabela existente, pode especificar se quer acrescentar ou substituir a tabela de destino.

Copie partições individuais

Pode copiar os dados de uma ou mais partições para outra tabela.

Consola

A cópia de partições não é suportada pela consola Trusted Cloud .

bq

Para copiar uma partição, use o comando bq cp (copy) da ferramenta de linhas de comando bq com um decorador de partição ($date), como $20160201.

É possível usar flags opcionais para controlar a disposição de escrita da partição de destino:

  • -a ou --append_table anexa os dados da partição de origem a uma tabela ou partição existente no conjunto de dados de destino.
  • -f ou --force substitui uma tabela ou uma partição existente no conjunto de dados de destino e não lhe pede confirmação.
  • -n ou --no_clobber devolve a seguinte mensagem de erro se a tabela ou a partição existir no conjunto de dados de destino: Table '<var>project_id:dataset.table</var> or <var>table$date</var>' already exists, skipping. Se -n não for especificado, o comportamento predefinido é pedir-lhe que escolha se quer substituir a tabela ou a partição de destino.
  • --destination_kms_key é a chave do Cloud KMS gerida pelo cliente usada para encriptar a tabela ou a partição de destino.

O comando cp não suporta as flags --time_partitioning_field nem --time_partitioning_type. Não pode usar uma tarefa de cópia para converter uma tabela particionada por tempo de ingestão numa tabela particionada.

A funcionalidade --destination_kms_key não é demonstrada aqui. Consulte o artigo Proteger dados com chaves do Cloud KMS para mais informações.

Se o conjunto de dados de origem ou de destino estiver num projeto diferente do seu projeto predefinido, adicione o ID do projeto aos nomes dos conjuntos de dados no seguinte formato: project_id:dataset.

(Opcional) Forneça a flag --location e defina o valor para a sua localização.

bq --location=location cp \
-a -f -n \
project_id:dataset.source_table$source_partition \
project_id:dataset.destination_table$destination_partition

Onde:

  • location é o nome da sua localização. A flag --location é opcional. Por exemplo, se estiver a usar o BigQuery na região de Tóquio, pode definir o valor da flag como asia-northeast1. Pode predefinir um valor para a localização através do ficheiro.bigqueryrc.
  • project_id é o ID do seu projeto.
  • dataset é o nome do conjunto de dados de origem ou de destino.
  • source_table é a tabela que está a copiar.
  • source_partition é o decorador de partições da partição de origem.
  • destination_table é o nome da tabela no conjunto de dados de destino.
  • destination_partition é o decorador de partições da partição de destino.

Exemplos:

Copiar uma partição para uma nova tabela

Introduza o seguinte comando para copiar a partição de 30 de janeiro de 2018 de mydataset.mytable para uma nova tabela: mydataset.mytable2. mydataset está no seu projeto predefinido.

bq cp -a 'mydataset.mytable$20180130' mydataset.mytable2

Copiar uma partição para uma tabela não particionada

Introduza o seguinte comando para copiar a partição de 30 de janeiro de 2018 de mydataset.mytable para uma tabela não particionada: mydataset2.mytable2. O atalho -a é usado para anexar os dados da partição à tabela de destino não particionada. Ambos os conjuntos de dados estão no seu projeto predefinido.

bq cp -a 'mydataset.mytable$20180130' mydataset2.mytable2

Introduza o seguinte comando para copiar a partição de 30 de janeiro de 2018 de mydataset.mytable para uma tabela não particionada: mydataset2.mytable2. O atalho -f é usado para substituir a tabela de destino não particionada sem aviso.

bq --location=US cp -f 'mydataset.mytable$20180130' mydataset2.mytable2

Copiar uma partição para outra tabela particionada

Introduza o seguinte comando para copiar a partição de 30 de janeiro de 2018 de mydataset.mytable para outra tabela particionada: mydataset2.mytable2. O atalho -a é usado para acrescentar os dados da partição à tabela de destino. Uma vez que não é especificado nenhum decorador de partição na tabela de destino, a chave de partição de origem é preservada e os dados são copiados para a partição de 30 de janeiro de 2018 na tabela de destino. Também pode especificar um decorador de partição na tabela de destino para copiar dados para uma partição específica. mydataset está no seu projeto predefinido. mydataset2 está em myotherproject e não no seu projeto predefinido.

bq --location=US cp \
-a \
'mydataset.mytable$20180130' \
myotherproject:mydataset2.mytable2

Introduza o seguinte comando para copiar a partição de 30 de janeiro de 2018 de mydataset.mytable para a partição de 30 de janeiro de 2018 de outra tabela particionada: mydataset2.mytable2. O atalho -f é usado para substituir a partição de 30 de janeiro de 2018 na tabela de destino sem pedir confirmação. Se não for usado nenhum decorador de partição, todos os dados na tabela de destino são substituídos. mydataset está no seu projeto predefinido. O recurso mydataset2 está em myotherproject e não no seu projeto predefinido.

bq cp \
-f \
'mydataset.mytable$20180130' \
'myotherproject:mydataset2.mytable2$20180130'

Introduza o seguinte comando para copiar a partição de 30 de janeiro de 2018 de mydataset.mytable para outra tabela particionada: mydataset2.mytable2. mydataset está no seu projeto predefinido. mydataset2 está em myotherproject e não no seu projeto predefinido. Se existirem dados na tabela de destino, o comportamento predefinido é pedir-lhe que os substitua.

bq cp \
'mydataset.mytable$20180130' \
myotherproject:mydataset2.mytable2

Para copiar várias partições, especifique-as como uma lista separada por vírgulas:

bq cp \
'mydataset.mytable$20180130,mydataset.mytable$20180131' \
myotherproject:mydataset.mytable2

API

Chame o método jobs.insert e configure uma tarefa copy. (Opcional) Especifique a sua região na propriedade location na secção jobReference do recurso de trabalho.

Especifique as seguintes propriedades na configuração da tarefa:

  • Introduza o conjunto de dados de origem, a tabela e a partição na propriedade sourceTables.
  • Introduza o conjunto de dados e a tabela de destino na propriedade destinationTable
  • Use a propriedade writeDisposition para especificar se deve acrescentar ou substituir a tabela ou a partição de destino.

Para copiar várias partições, introduza as partições de origem (incluindo os nomes do conjunto de dados e da tabela) na propriedade sourceTables.

Elimine uma partição

Pode eliminar uma partição individual de uma tabela particionada. No entanto, não pode eliminar as partições especiais __NULL__ ou __UNPARTITIONED__.

Só pode eliminar uma partição de cada vez.

Pode eliminar uma partição especificando o decorador da partição, a menos que seja uma das duas partições especiais.

Para eliminar uma partição numa tabela particionada:

Consola

A eliminação de partições não é suportada pela consola do Trusted Cloud .

SQL

Se uma declaração qualificadoraDELETE abrange todas as linhas numa partição, o BigQuery remove a partição inteira. Esta remoção é feita sem analisar bytes nem consumir espaços. O exemplo seguinte de uma declaração DELETE abrange toda a partição de um filtro na pseudocoluna _PARTITIONDATE:

  1. Na Trusted Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No editor de consultas, introduza a seguinte declaração:

    DELETE mydataset.mytable
    WHERE _PARTITIONDATE IN ('2076-10-07', '2076-03-06');

  3. Clique em Executar.

Para mais informações sobre como executar consultas, consulte o artigo Execute uma consulta interativa.

bq

Use o comando bq rm com a flag --table (ou o atalho -t) e especifique o decorador de partição para eliminar uma partição específica.

bq rm --table project_id:dataset.table$partition

Onde:

  • project_id é o ID do seu projeto. Se for omitido, é usado o seu projeto predefinido.
  • dataset é o nome do conjunto de dados que contém a tabela.
  • table é o nome da tabela.
  • partition é o decorador de partições da partição que está a eliminar.

Os decoradores de partições têm o seguinte formato, consoante o tipo de partição:

  • Partição por hora: yyyymmddhh. Exemplo: $2016030100.
  • Partição diária: yyyymmdd. Exemplo: $20160301.
  • Partição mensal: yyyymm. Exemplo: $201603.
  • Partição anual: yyyy. Exemplo: $2016.
  • Partição de intervalo de números inteiros: início do intervalo de partição. Exemplo: $20.

A ferramenta de linhas de comando bq pede-lhe para confirmar a ação. Para ignorar a confirmação, use a flag --force (ou o atalho -f).

Exemplos:

Elimine a partição de 1 de março de 2016 numa tabela particionada diariamente denominada mydataset.mytable no seu projeto predefinido:

bq rm --table 'mydataset.mytable$20160301'

Eliminar a partição de março de 2016 numa tabela particionada mensalmente:

bq rm --table 'mydataset.mytable$201603'

Elimine o intervalo de números inteiros que começa em 20 numa tabela particionada por intervalo de números inteiros denominada mydataset.mytable:

bq rm --table 'mydataset.mytable$20'

API

Chame o método tables.delete e especifique o decorador de tabela e partição através do parâmetro tableId.

Segurança da tabela particionada

O controlo de acesso para tabelas particionadas é igual ao controlo de acesso para tabelas padrão. Para mais informações, consulte o artigo Introdução aos controlos de acesso a tabelas.