Modificar esquemas de tabelas

Este documento descreve como modificar as definições do esquema para tabelas do BigQuery existentes.

Pode fazer a maioria das modificações do esquema descritas neste documento através de declarações de linguagem de definição de dados (LDD) SQL. Estes extratos não geram cobranças.

Pode modificar um esquema de tabela de todas as formas descritas nesta página exportando os dados da tabela para o Cloud Storage e, em seguida, carregando os dados para uma nova tabela com a definição do esquema modificado. As tarefas de carregamento e exportação do BigQuery são gratuitas, mas incorre em custos pelo armazenamento dos dados exportados no Cloud Storage. As secções seguintes descrevem outras formas de fazer vários tipos de modificações do esquema.

Adicione uma coluna

Pode adicionar colunas à definição do esquema de uma tabela existente através de uma das seguintes opções:

  • Adicione uma nova coluna vazia.
  • Substitua uma tabela por uma tarefa de carregamento ou de consulta.
  • Anexe dados a uma tabela com uma tarefa de carregamento ou consulta.

Qualquer coluna que adicionar tem de cumprir as regras do BigQuery para nomes de colunas. Para mais informações sobre como criar componentes de esquema, consulte o artigo Especificar um esquema.

Adicione uma coluna vazia

Se adicionar novas colunas a um esquema de tabela existente, as colunas têm de ser do tipo NULLABLE ou REPEATED. Não pode adicionar uma coluna REQUIRED a um esquema de tabela existente. A adição de uma coluna REQUIRED a um esquema de tabela existente na API ou na ferramenta de linhas de comando bq provoca um erro. No entanto, pode criar uma coluna REQUIRED aninhada como parte de um novo campo RECORD. As colunas REQUIRED só podem ser adicionadas quando cria uma tabela durante o carregamento de dados ou quando cria uma tabela vazia com uma definição de esquema.

Para adicionar colunas vazias à definição do esquema de uma tabela:

Consola

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

    Aceda ao BigQuery

  2. No painel Explorador, expanda o projeto e o conjunto de dados e, de seguida, selecione a tabela.

  3. No painel de detalhes, clique no separador Esquema.

  4. Clique em Editar esquema. Pode ter de deslocar a página para ver este botão.

  5. Na página Esquema atual, em Novos campos, clique em Adicionar campo.

    • Em Nome, escreva o nome da coluna.
    • Para Tipo, escolha o tipo de dados.
    • Para Modo, escolha NULLABLE ou REPEATED.
  6. Quando terminar de adicionar colunas, clique em Guardar.

SQL

Use a ALTER TABLE ADD COLUMN declaração DDL:

  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
    ADD COLUMN new_column STRING;

  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 e forneça um ficheiro de esquema JSON. Se a tabela que está a atualizar estiver num projeto diferente do projeto predefinido, adicione o ID do projeto ao nome do conjunto de dados no seguinte formato: PROJECT_ID:DATASET.

bq update PROJECT_ID:DATASET.TABLE SCHEMA

Substitua o seguinte:

  • 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.
  • SCHEMA: o caminho para o ficheiro de esquema JSON no seu computador local.

Quando especifica um esquema inline, não pode especificar a descrição, o modo e o tipo de coluna RECORD (STRUCT). Todos os modos de coluna têm NULLABLE como predefinição. Como resultado, se estiver a adicionar uma nova coluna aninhada a um RECORD, tem de fornecer um ficheiro de esquema JSON.

Se tentar adicionar colunas através de uma definição de esquema inline, tem de fornecer a definição de esquema completa, incluindo as novas colunas. Uma vez que não pode especificar modos de coluna através de uma definição de esquema inline, a atualização altera qualquer coluna REPEATED existente para NULLABLE, o que produz o seguinte erro: BigQuery error in update operation: Provided Schema does not match Table PROJECT_ID:dataset.table. Field field has changed mode from REPEATED to NULLABLE.

O método preferencial para adicionar colunas a uma tabela existente através da ferramenta de linhas de comando bq é fornecer um ficheiro de esquema JSON.

Para adicionar colunas vazias ao esquema de uma tabela através de um ficheiro de esquema JSON:

  1. Primeiro, execute o comando bq show com a flag --schema e escreva o esquema da tabela existente num ficheiro. Se a tabela que está a atualizar estiver num projeto diferente do projeto predefinido, adicione o ID do projeto ao nome do conjunto de dados no seguinte formato: PROJECT_ID:DATASET.

    bq show \
    --schema \
    --format=prettyjson \
    PROJECT_ID:DATASET.TABLE > SCHEMA

    Substitua o seguinte:

    • 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.
    • SCHEMA: o ficheiro de definição do esquema escrito no seu computador local.

    Por exemplo, para escrever a definição do esquema de mydataset.mytable num ficheiro, introduza o seguinte comando. mydataset.mytable está no seu projeto predefinido.

       bq show \
       --schema \
       --format=prettyjson \
       mydataset.mytable > /tmp/myschema.json
    
  2. Abra o ficheiro de esquema num editor de texto. O esquema deve ter o seguinte aspeto:

    [
      {
        "mode": "REQUIRED",
        "name": "column1",
        "type": "STRING"
      },
      {
        "mode": "REQUIRED",
        "name": "column2",
        "type": "FLOAT"
      },
      {
        "mode": "REPEATED",
        "name": "column3",
        "type": "STRING"
      }
    ]
    
  3. Adicione as novas colunas ao final da definição do esquema. Se tentar adicionar novas colunas noutro local da matriz, é devolvido o seguinte erro: BigQuery error in update operation: Precondition Failed.

    Através de um ficheiro JSON, pode especificar descrições, modos NULLABLE ou REPEATED e tipos RECORD para novas colunas. Por exemplo, usando a definição do esquema do passo anterior, a nova matriz JSON teria o seguinte aspeto. Neste exemplo, é adicionada uma nova coluna NULLABLE com o nome column4. column4 inclui uma descrição.

      [
        {
          "mode": "REQUIRED",
          "name": "column1",
          "type": "STRING"
        },
        {
          "mode": "REQUIRED",
          "name": "column2",
          "type": "FLOAT"
        },
        {
          "mode": "REPEATED",
          "name": "column3",
          "type": "STRING"
        },
        {
          "description": "my new column",
          "mode": "NULLABLE",
          "name": "column4",
          "type": "STRING"
        }
      ]
      

    Para mais informações sobre como trabalhar com ficheiros de esquema JSON, consulte o artigo Especificar um ficheiro de esquema JSON.

  4. Depois de atualizar o ficheiro de esquema, execute o seguinte comando para atualizar o esquema da tabela. Se a tabela que está a atualizar estiver num projeto diferente do seu projeto predefinido, adicione o ID do projeto ao nome do conjunto de dados no seguinte formato: PROJECT_ID:DATASET.

    bq update PROJECT_ID:DATASET.TABLE SCHEMA

    Substitua o seguinte:

    • 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.
    • SCHEMA: o ficheiro de definição do esquema escrito no seu computador local.

    Por exemplo, introduza o seguinte comando para atualizar a definição do esquema de mydataset.mytable no seu projeto predefinido. O caminho para o ficheiro de esquema na sua máquina local é /tmp/myschema.json.

    bq update mydataset.mytable /tmp/myschema.json
    

API

Chame o método tables.patch e use a propriedade schema para adicionar colunas vazias à definição do esquema. Uma vez que o método tables.update substitui todo o recurso de tabela, o método tables.patch é o preferível.

Go

Antes de experimentar este exemplo, siga as Goinstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Go 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 (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// updateTableAddColumn demonstrates modifying the schema of a table to append an additional column.
func updateTableAddColumn(projectID, datasetID, tableID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// tableID := "mytable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	tableRef := client.Dataset(datasetID).Table(tableID)
	meta, err := tableRef.Metadata(ctx)
	if err != nil {
		return err
	}
	newSchema := append(meta.Schema,
		&bigquery.FieldSchema{Name: "phone", Type: bigquery.StringFieldType},
	)
	update := bigquery.TableMetadataToUpdate{
		Schema: newSchema,
	}
	if _, err := tableRef.Update(ctx, update, meta.ETag); err != nil {
		return err
	}
	return nil
}

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.Field;
import com.google.cloud.bigquery.FieldList;
import com.google.cloud.bigquery.LegacySQLTypeName;
import com.google.cloud.bigquery.Schema;
import com.google.cloud.bigquery.StandardTableDefinition;
import com.google.cloud.bigquery.Table;
import java.util.ArrayList;
import java.util.List;

public class AddEmptyColumn {

  public static void runAddEmptyColumn() {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableId = "MY_TABLE_NAME";
    String newColumnName = "NEW_COLUMN_NAME";
    addEmptyColumn(newColumnName, datasetName, tableId);
  }

  public static void addEmptyColumn(String newColumnName, String datasetName, String tableId) {
    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, tableId);
      Schema schema = table.getDefinition().getSchema();
      FieldList fields = schema.getFields();

      // Create the new field/column
      Field newField = Field.of(newColumnName, LegacySQLTypeName.STRING);

      // Create a new schema adding the current fields, plus the new one
      List<Field> fieldList = new ArrayList<Field>();
      fields.forEach(fieldList::add);
      fieldList.add(newField);
      Schema newSchema = Schema.of(fieldList);

      // Update the table with the new schema
      Table updatedTable =
          table.toBuilder().setDefinition(StandardTableDefinition.of(newSchema)).build();
      updatedTable.update();
      System.out.println("Empty column successfully added to table");
    } catch (BigQueryException e) {
      System.out.println("Empty column was not added. \n" + e.toString());
    }
  }
}

Node.js

Antes de experimentar este exemplo, siga as Node.jsinstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Node.js 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 the Google Cloud client library and create a client
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();

async function addEmptyColumn() {
  // Adds an empty column to the schema.

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const datasetId = 'my_dataset';
  // const tableId = 'my_table';
  const column = {name: 'size', type: 'STRING'};

  // Retrieve current table metadata
  const table = bigquery.dataset(datasetId).table(tableId);
  const [metadata] = await table.getMetadata();

  // Update table schema
  const schema = metadata.schema;
  const new_schema = schema;
  new_schema.fields.push(column);
  metadata.schema = new_schema;

  const [result] = await table.setMetadata(metadata);
  console.log(result.schema.fields);
}

Python

Antes de experimentar este exemplo, siga as Pythoninstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Python 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.

Anexe um novo objeto SchemaField a uma cópia de Table.schema e, em seguida, substitua o valor da propriedade Table.schema pelo esquema atualizado.
from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set table_id to the ID of the table
#                  to add an empty column.
# table_id = "your-project.your_dataset.your_table_name"

table = client.get_table(table_id)  # Make an API request.

original_schema = table.schema
new_schema = original_schema[:]  # Creates a copy of the schema.
new_schema.append(bigquery.SchemaField("phone", "STRING"))

table.schema = new_schema
table = client.update_table(table, ["schema"])  # Make an API request.

if len(table.schema) == len(original_schema) + 1 == len(new_schema):
    print("A new column has been added.")
else:
    print("The column has not been added.")

Adicione uma coluna aninhada a uma coluna RECORD

Além de adicionar novas colunas ao esquema de uma tabela, também pode adicionar novas colunas aninhadas a uma coluna RECORD. O processo de adição de uma nova coluna aninhada é semelhante ao processo de adição de uma nova coluna.

Consola

A adição de um novo campo aninhado a uma coluna RECORD existente não é suportada pela consola Trusted Cloud .

SQL

Não é suportada a adição de um novo campo aninhado a uma coluna RECORD existente através de uma declaração SQL DDL.

bq

Emita o comando bq update e faculte um ficheiro de esquema JSON que adicione o campo aninhado à definição do esquema da coluna RECORD existente. Se a tabela que está a atualizar estiver num projeto diferente do projeto predefinido, adicione o ID do projeto ao nome do conjunto de dados no seguinte formato: PROJECT_ID:DATASET.

bq update PROJECT_ID:DATASET.TABLE SCHEMA

Substitua o seguinte:

  • 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.
  • SCHEMA : o caminho para o ficheiro de esquema JSON no seu computador local.

Quando especifica um esquema inline, não pode especificar a descrição, o modo e o tipo de coluna RECORD (STRUCT). Todos os modos de coluna têm NULLABLE como predefinição. Como resultado, se estiver a adicionar uma nova coluna aninhada a um RECORD, tem de fornecer um ficheiro de esquema JSON.

Para adicionar uma coluna aninhada a um RECORD através de um ficheiro de esquema JSON:

  1. Primeiro, execute o comando bq show com a flag --schema e escreva o esquema da tabela existente num ficheiro. Se a tabela que está a atualizar estiver num projeto diferente do projeto predefinido, adicione o ID do projeto ao nome do conjunto de dados no seguinte formato: PROJECT_ID:DATASET.TABLE.

    bq show \
    --schema \
    --format=prettyjson \
    PROJECT_ID:DATASET.TABLE > SCHEMA

    Substitua o seguinte:

    • 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.
    • SCHEMA: o ficheiro de definição do esquema escrito no seu computador local.

    Por exemplo, para escrever a definição do esquema de mydataset.mytable num ficheiro, introduza o seguinte comando. mydataset.mytable está no seu projeto predefinido.

    bq show \
    --schema \
    --format=prettyjson \
    mydataset.mytable > /tmp/myschema.json
    
  2. Abra o ficheiro de esquema num editor de texto. O esquema deve ter o seguinte aspeto. Neste exemplo, column3 é uma coluna repetida aninhada. As colunas aninhadas são nested1 e nested2. A matriz fields apresenta os campos aninhados em column3.

    [
      {
        "mode": "REQUIRED",
        "name": "column1",
        "type": "STRING"
      },
      {
        "mode": "REQUIRED",
        "name": "column2",
        "type": "FLOAT"
      },
      {
        "fields": [
          {
            "mode": "NULLABLE",
            "name": "nested1",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "nested2",
            "type": "STRING"
          }
        ],
        "mode": "REPEATED",
        "name": "column3",
        "type": "RECORD"
      }
    ]
    
  3. Adicione a nova coluna aninhada ao final da matriz fields. Neste exemplo, nested3 é a nova coluna aninhada.

      [
        {
          "mode": "REQUIRED",
          "name": "column1",
          "type": "STRING"
        },
        {
          "mode": "REQUIRED",
          "name": "column2",
          "type": "FLOAT"
        },
        {
          "fields": [
            {
              "mode": "NULLABLE",
              "name": "nested1",
              "type": "STRING"
            },
            {
              "mode": "NULLABLE",
              "name": "nested2",
              "type": "STRING"
            },
            {
              "mode": "NULLABLE",
              "name": "nested3",
              "type": "STRING"
            }
          ],
          "mode": "REPEATED",
          "name": "column3",
          "type": "RECORD"
        }
      ]
      

    Para mais informações sobre como trabalhar com ficheiros de esquema JSON, consulte o artigo Especificar um ficheiro de esquema JSON.

  4. Depois de atualizar o ficheiro de esquema, execute o seguinte comando para atualizar o esquema da tabela. Se a tabela que está a atualizar estiver num projeto diferente do seu projeto predefinido, adicione o ID do projeto ao nome do conjunto de dados no seguinte formato: PROJECT_ID:DATASET.

    bq update PROJECT_ID:DATASET.TABLE SCHEMA

    Substitua o seguinte:

    • 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.
    • SCHEMA: o caminho para o ficheiro de esquema JSON no seu computador local.

    Por exemplo, introduza o seguinte comando para atualizar a definição do esquema de mydataset.mytable no seu projeto predefinido. O caminho para o ficheiro de esquema na sua máquina local é /tmp/myschema.json.

    bq update mydataset.mytable /tmp/myschema.json
    

API

Chame o método tables.patch e use a propriedade schema para adicionar as colunas aninhadas à definição do esquema. Uma vez que o método tables.update substitui todo o recurso de tabela, o método tables.patch é o preferido.

Adicione colunas quando substitui ou anexa dados

Pode adicionar novas colunas a uma tabela existente quando carrega dados na mesma e opta por substituir a tabela existente. Quando substitui uma tabela existente, o esquema dos dados que está a carregar é usado para substituir o esquema da tabela existente. Para obter informações sobre como substituir uma tabela através de uma tarefa de carregamento, consulte o documento para o formato dos seus dados:

Adicione colunas num trabalho de carregamento de anexação

Pode adicionar colunas a uma tabela quando lhe acrescenta dados num trabalho de carregamento. O novo esquema é determinado por uma das seguintes opções:

  • Deteção automática (para ficheiros CSV e JSON)
  • Um esquema especificado num ficheiro de esquema JSON (para ficheiros CSV e JSON)
  • Os dados de origem autodescritivos para ficheiros de exportação Avro, ORC, Parquet e Datastore

Se especificar o esquema num ficheiro JSON, as novas colunas têm de ser definidas no mesmo. Se as novas definições de colunas estiverem em falta, é devolvido um erro quando tenta anexar os dados.

Quando adiciona novas colunas durante uma operação de anexação, os valores nas novas colunas são definidos como NULL para as linhas existentes.

Para adicionar uma nova coluna quando acrescenta dados a uma tabela durante uma tarefa de carregamento, use uma das seguintes opções:

bq

Use o comando bq load para carregar os dados e especifique a flag --noreplace para indicar que está a anexar os dados a uma tabela existente.

Se os dados que está a acrescentar estiverem no formato CSV ou JSON delimitado por newline, especifique a flag --autodetect para usar a deteção automática de esquemas ou forneça o esquema num ficheiro de esquema JSON. As colunas adicionadas podem ser inferidas automaticamente a partir de ficheiros de exportação Avro ou Datastore.

Defina a flag --schema_update_option como ALLOW_FIELD_ADDITION para indicar que os dados que está a acrescentar contêm novas colunas.

Se a tabela que está a acrescentar estiver num conjunto de dados num projeto diferente do seu projeto predefinido, adicione o ID do projeto ao nome do conjunto de dados no seguinte formato: PROJECT_ID:DATASET.

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

Introduza o comando load da seguinte forma:

bq --location=LOCATION load \
--noreplace \
--autodetect \
--schema_update_option=ALLOW_FIELD_ADDITION \
--source_format=FORMAT \
PROJECT_ID:DATASET.TABLE \
PATH_TO_SOURCE \
SCHEMA

Substitua o seguinte:

  • 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, defina o valor da flag como asia-northeast1. Pode definir um valor predefinido para a localização através do ficheiro.bigqueryrc.
  • FORMAT: o formato do esquema. NEWLINE_DELIMITED_JSON, CSV, AVRO, PARQUET, ORC ou DATASTORE_BACKUP.
  • PROJECT_ID: o ID do seu projeto.
  • DATASET: o nome do conjunto de dados que contém a tabela.
  • TABLE: o nome da tabela que está a anexar.
  • PATH_TO_SOURCE: um URI do Cloud Storage> totalmente qualificado, uma lista de URIs separados por vírgulas ou o caminho para um ficheiro de dados na sua máquina local.
  • SCHEMA: o caminho para um ficheiro de esquema JSON local. Um ficheiro de esquema só é necessário para ficheiros CSV e JSON quando --autodetect não está especificado. Os esquemas Avro e Datastore são inferidos a partir dos dados de origem.

Exemplos:

Introduza o seguinte comando para anexar um ficheiro de dados Avro local, /tmp/mydata.avro, a mydataset.mytable através de uma tarefa de carregamento. Como os esquemas podem ser inferidos automaticamente a partir de dados Avro, não precisa de usar a flag --autodetect. mydataset está no seu projeto predefinido.

bq load \
--noreplace \
--schema_update_option=ALLOW_FIELD_ADDITION \
--source_format=AVRO \
mydataset.mytable \
/tmp/mydata.avro

Introduza o seguinte comando para anexar um ficheiro de dados JSON delimitado por novas linhas no Google Cloud Storage a mydataset.mytable através de uma tarefa de carregamento. A --autodetect flag é usada para detetar as novas colunas. mydataset está no seu projeto predefinido.

bq load \
--noreplace \
--autodetect \
--schema_update_option=ALLOW_FIELD_ADDITION \
--source_format=NEWLINE_DELIMITED_JSON \
mydataset.mytable \
gs://mybucket/mydata.json

Introduza o seguinte comando para anexar um ficheiro de dados JSON delimitado por novas linhas no Google Cloud Storage a mydataset.mytable através de uma tarefa de carregamento. O esquema que contém as novas colunas é especificado num ficheiro de esquema JSON local, /tmp/myschema.json. mydataset está em myotherproject e não no seu projeto predefinido.

bq load \
--noreplace \
--schema_update_option=ALLOW_FIELD_ADDITION \
--source_format=NEWLINE_DELIMITED_JSON \
myotherproject:mydataset.mytable \
gs://mybucket/mydata.json \
/tmp/myschema.json

API

Chame o método jobs.insert. Configure uma tarefa load e defina as seguintes propriedades:

  • Faça referência aos seus dados no Cloud Storage através da propriedade sourceUris.
  • Especifique o formato de dados definindo a propriedade sourceFormat.
  • Especifique o esquema na propriedade schema.
  • Especifique a opção de atualização do esquema através da propriedade schemaUpdateOptions.
  • Defina a disposição de escrita da tabela de destino para WRITE_APPEND usando a propriedade writeDisposition.

Go

Antes de experimentar este exemplo, siga as Goinstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Go 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 (
	"context"
	"fmt"
	"os"

	"cloud.google.com/go/bigquery"
)

// createTableAndWidenLoad demonstrates augmenting a table's schema to add a new column via a load job.
func createTableAndWidenLoad(projectID, datasetID, tableID, filename string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// tableID := "mytable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	sampleSchema := bigquery.Schema{
		{Name: "full_name", Type: bigquery.StringFieldType},
	}
	meta := &bigquery.TableMetadata{
		Schema: sampleSchema,
	}
	tableRef := client.Dataset(datasetID).Table(tableID)
	if err := tableRef.Create(ctx, meta); err != nil {
		return err
	}
	// Now, import data from a local file, but specify field additions are allowed.
	// Because the data has a second column (age), the schema is amended as part of
	// the load.
	f, err := os.Open(filename)
	if err != nil {
		return err
	}
	source := bigquery.NewReaderSource(f)
	source.AutoDetect = true   // Allow BigQuery to determine schema.
	source.SkipLeadingRows = 1 // CSV has a single header line.

	loader := client.Dataset(datasetID).Table(tableID).LoaderFrom(source)
	loader.SchemaUpdateOptions = []string{"ALLOW_FIELD_ADDITION"}
	job, err := loader.Run(ctx)
	if err != nil {
		return err
	}
	status, err := job.Wait(ctx)
	if err != nil {
		return err
	}
	if err := status.Err(); err != nil {
		return err
	}
	return nil
}

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.Field;
import com.google.cloud.bigquery.FormatOptions;
import com.google.cloud.bigquery.Job;
import com.google.cloud.bigquery.JobId;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.JobInfo.SchemaUpdateOption;
import com.google.cloud.bigquery.JobInfo.WriteDisposition;
import com.google.cloud.bigquery.LegacySQLTypeName;
import com.google.cloud.bigquery.LoadJobConfiguration;
import com.google.cloud.bigquery.Schema;
import com.google.cloud.bigquery.TableId;
import com.google.common.collect.ImmutableList;
import java.util.UUID;

public class AddColumnLoadAppend {

  public static void runAddColumnLoadAppend() throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    String sourceUri = "/path/to/file.csv";
    addColumnLoadAppend(datasetName, tableName, sourceUri);
  }

  public static void addColumnLoadAppend(String datasetName, String tableName, String sourceUri)
      throws Exception {
    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();

      TableId tableId = TableId.of(datasetName, tableName);

      // Add a new column to a BigQuery table while appending rows via a load job.
      // 'REQUIRED' fields cannot  be added to an existing schema, so the additional column must be
      // 'NULLABLE'.
      Schema newSchema =
          Schema.of(
              Field.newBuilder("name", LegacySQLTypeName.STRING)
                  .setMode(Field.Mode.REQUIRED)
                  .build(),
              // Adding below additional column during the load job
              Field.newBuilder("post_abbr", LegacySQLTypeName.STRING)
                  .setMode(Field.Mode.NULLABLE)
                  .build());

      LoadJobConfiguration loadJobConfig =
          LoadJobConfiguration.builder(tableId, sourceUri)
              .setFormatOptions(FormatOptions.csv())
              .setWriteDisposition(WriteDisposition.WRITE_APPEND)
              .setSchema(newSchema)
              .setSchemaUpdateOptions(ImmutableList.of(SchemaUpdateOption.ALLOW_FIELD_ADDITION))
              .build();

      // Create a job ID so that we can safely retry.
      JobId jobId = JobId.of(UUID.randomUUID().toString());
      Job loadJob = bigquery.create(JobInfo.newBuilder(loadJobConfig).setJobId(jobId).build());

      // Load data from a GCS parquet file into the table
      // Blocks until this load table job completes its execution, either failing or succeeding.
      Job completedJob = loadJob.waitFor();

      // Check for errors
      if (completedJob == null) {
        throw new Exception("Job not executed since it no longer exists.");
      } else if (completedJob.getStatus().getError() != null) {
        // You can also look at queryJob.getStatus().getExecutionErrors() for all
        // errors, not just the latest one.
        throw new Exception(
            "BigQuery was unable to load into the table due to an error: \n"
                + loadJob.getStatus().getError());
      }
      System.out.println("Column successfully added during load append job");
    } catch (BigQueryException | InterruptedException e) {
      System.out.println("Column not added during load append \n" + e.toString());
    }
  }
}

Node.js

Antes de experimentar este exemplo, siga as Node.jsinstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Node.js 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 the Google Cloud client libraries
const {BigQuery} = require('@google-cloud/bigquery');

// Instantiate client
const bigquery = new BigQuery();

async function addColumnLoadAppend() {
  // Adds a new column to a BigQuery table while appending rows via a load job.

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const fileName = '/path/to/file.csv';
  // const datasetId = 'my_dataset';
  // const tableId = 'my_table';

  // In this example, the existing table contains only the 'Name', 'Age',
  // & 'Weight' columns. 'REQUIRED' fields cannot  be added to an existing
  // schema, so the additional column must be 'NULLABLE'.
  const schema = 'Name:STRING, Age:INTEGER, Weight:FLOAT, IsMagic:BOOLEAN';

  // Retrieve destination table reference
  const [table] = await bigquery
    .dataset(datasetId)
    .table(tableId)
    .get();
  const destinationTableRef = table.metadata.tableReference;

  // Set load job options
  const options = {
    schema: schema,
    schemaUpdateOptions: ['ALLOW_FIELD_ADDITION'],
    writeDisposition: 'WRITE_APPEND',
    destinationTable: destinationTableRef,
  };

  // Load data from a local file into the table
  const [job] = await bigquery
    .dataset(datasetId)
    .table(tableId)
    .load(fileName, options);

  console.log(`Job ${job.id} completed.`);
  console.log(`New Schema:`);
  console.log(job.configuration.load.schema.fields);

  // Check the job's status for errors
  const errors = job.status.errors;
  if (errors && errors.length > 0) {
    throw errors;
  }
}

Python

Antes de experimentar este exemplo, siga as Pythoninstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Python 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.

# from google.cloud import bigquery
# client = bigquery.Client()
# project = client.project
# dataset_ref = bigquery.DatasetReference(project, 'my_dataset')
# filepath = 'path/to/your_file.csv'

# Retrieves the destination table and checks the length of the schema
table_id = "my_table"
table_ref = dataset_ref.table(table_id)
table = client.get_table(table_ref)
print("Table {} contains {} columns.".format(table_id, len(table.schema)))

# Configures the load job to append the data to the destination table,
# allowing field addition
job_config = bigquery.LoadJobConfig()
job_config.write_disposition = bigquery.WriteDisposition.WRITE_APPEND
job_config.schema_update_options = [
    bigquery.SchemaUpdateOption.ALLOW_FIELD_ADDITION
]
# In this example, the existing table contains only the 'full_name' column.
# 'REQUIRED' fields cannot be added to an existing schema, so the
# additional column must be 'NULLABLE'.
job_config.schema = [
    bigquery.SchemaField("full_name", "STRING", mode="REQUIRED"),
    bigquery.SchemaField("age", "INTEGER", mode="NULLABLE"),
]
job_config.source_format = bigquery.SourceFormat.CSV
job_config.skip_leading_rows = 1

with open(filepath, "rb") as source_file:
    job = client.load_table_from_file(
        source_file,
        table_ref,
        location="US",  # Must match the destination dataset location.
        job_config=job_config,
    )  # API request

job.result()  # Waits for table load to complete.
print(
    "Loaded {} rows into {}:{}.".format(
        job.output_rows, dataset_id, table_ref.table_id
    )
)

# Checks the updated length of the schema
table = client.get_table(table)
print("Table {} now contains {} columns.".format(table_id, len(table.schema)))

Adicione colunas num trabalho de anexação de consultas

Pode adicionar colunas a uma tabela quando lhe anexa resultados de consultas.

Quando adiciona colunas através de uma operação de anexação num trabalho de consulta, o esquema dos resultados da consulta é usado para atualizar o esquema da tabela de destino. Tenha em atenção que não pode consultar uma tabela numa localização e escrever os resultados numa tabela noutra localização.

Para adicionar uma nova coluna quando acrescenta dados a uma tabela durante uma tarefa de consulta, selecione uma das seguintes opções:

bq

Use o comando bq query para consultar os seus dados e especifique a flag --destination_table para indicar a tabela à qual está a anexar.

Para especificar que está a anexar resultados da consulta a uma tabela de destino existente, especifique a flag --append_table.

Defina a flag --schema_update_option como ALLOW_FIELD_ADDITION para indicar que os resultados da consulta que está a anexar contêm novas colunas.

Especifique a flag use_legacy_sql=false para usar a sintaxe GoogleSQL para a consulta.

Se a tabela que está a acrescentar estiver num conjunto de dados num projeto diferente do seu projeto predefinido, adicione o ID do projeto ao nome do conjunto de dados no seguinte formato: PROJECT_ID:DATASET. Tenha em atenção que a tabela que está a consultar e a tabela de destino têm de estar na mesma localização.

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

bq --location=LOCATION query \
--destination_table PROJECT_ID:DATASET.TABLE \
--append_table \
--schema_update_option=ALLOW_FIELD_ADDITION \
--use_legacy_sql=false \
'QUERY'

Substitua o seguinte:

  • 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, defina o valor da flag como asia-northeast1. Pode definir um valor predefinido para a localização através do ficheiro.bigqueryrc. Tenha em atenção que não pode anexar resultados de consultas a uma tabela noutra localização.
  • PROJECT_ID: o ID do seu projeto.
  • dataset: o nome do conjunto de dados que contém a tabela que está a anexar.
  • TABLE: o nome da tabela que está a anexar.
  • QUERY: uma consulta na sintaxe GoogleSQL.

Exemplos:

Introduza o seguinte comando para consultar mydataset.mytable no seu projeto predefinido e anexar os resultados da consulta a mydataset.mytable2 (também no seu projeto predefinido).

bq query \
--destination_table mydataset.mytable2 \
--append_table \
--schema_update_option=ALLOW_FIELD_ADDITION \
--use_legacy_sql=false \
'SELECT
   column1,column2
 FROM
   mydataset.mytable'

Introduza o seguinte comando para consultar mydataset.mytable no seu projeto predefinido e anexar os resultados da consulta a mydataset.mytable2 em myotherproject.

bq query \
--destination_table myotherproject:mydataset.mytable2 \
--append_table \
--schema_update_option=ALLOW_FIELD_ADDITION \
--use_legacy_sql=false \
'SELECT
   column1,column2
 FROM
   mydataset.mytable'

API

Chame o método jobs.insert. Configure uma tarefa query e defina as seguintes propriedades:

  • Especifique a tabela de destino através da propriedade destinationTable.
  • Defina a disposição de escrita da tabela de destino para WRITE_APPEND usando a propriedade writeDisposition.
  • Especifique a opção de atualização do esquema através da propriedade schemaUpdateOptions.
  • Especifique a consulta GoogleSQL através da propriedade query.

Go

Antes de experimentar este exemplo, siga as Goinstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Go 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 (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// createTableAndWidenQuery demonstrates how the schema of a table can be modified to add columns by appending
// query results that include the new columns.
func createTableAndWidenQuery(projectID, datasetID, tableID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// tableID := "mytable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	// First, we create a sample table.
	sampleSchema := bigquery.Schema{
		{Name: "full_name", Type: bigquery.StringFieldType, Required: true},
		{Name: "age", Type: bigquery.IntegerFieldType, Required: true},
	}
	original := &bigquery.TableMetadata{
		Schema: sampleSchema,
	}
	tableRef := client.Dataset(datasetID).Table(tableID)
	if err := tableRef.Create(ctx, original); err != nil {
		return err
	}
	// Our table has two columns.  We'll introduce a new favorite_color column via
	// a subsequent query that appends to the table.
	q := client.Query("SELECT \"Timmy\" as full_name, 85 as age, \"Blue\" as favorite_color")
	q.SchemaUpdateOptions = []string{"ALLOW_FIELD_ADDITION"}
	q.QueryConfig.Dst = client.Dataset(datasetID).Table(tableID)
	q.WriteDisposition = bigquery.WriteAppend
	q.Location = "US"
	job, err := q.Run(ctx)
	if err != nil {
		return err
	}
	_, err = job.Wait(ctx)
	if err != nil {
		return err
	}
	return nil
}

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.Job;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.JobInfo.SchemaUpdateOption;
import com.google.cloud.bigquery.JobInfo.WriteDisposition;
import com.google.cloud.bigquery.QueryJobConfiguration;
import com.google.cloud.bigquery.TableId;
import com.google.cloud.bigquery.TableResult;
import com.google.common.collect.ImmutableList;

public class RelaxTableQuery {

  public static void runRelaxTableQuery() throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "MY_PROJECT_ID";
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    relaxTableQuery(projectId, datasetName, tableName);
  }

  // To relax all columns in a destination table when you append data to it during a query job
  public static void relaxTableQuery(String projectId, String datasetName, String tableName)
      throws Exception {
    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();

      TableId tableId = TableId.of(datasetName, tableName);

      String sourceTable = "`" + projectId + "." + datasetName + "." + tableName + "`";
      String query = "SELECT word FROM " + sourceTable + " WHERE word like '%is%'";

      QueryJobConfiguration queryConfig =
          QueryJobConfiguration.newBuilder(query)
              // Use standard SQL syntax for queries.
              // See: https://cloud.google.com/bigquery/sql-reference/
              .setUseLegacySql(false)
              .setSchemaUpdateOptions(ImmutableList.of(SchemaUpdateOption.ALLOW_FIELD_RELAXATION))
              .setWriteDisposition(WriteDisposition.WRITE_APPEND)
              .setDestinationTable(tableId)
              .build();

      Job queryJob = bigquery.create(JobInfo.newBuilder(queryConfig).build());

      queryJob = queryJob.waitFor();

      // Check for errors
      if (queryJob == null) {
        throw new Exception("Job no longer exists");
      } else if (queryJob.getStatus().getError() != null) {
        // You can also look at queryJob.getStatus().getExecutionErrors() for all
        // errors, not just the latest one.
        throw new Exception(queryJob.getStatus().getError().toString());
      }

      // Get the results.
      TableResult results = queryJob.getQueryResults();

      // Print all pages of the results.
      results
          .iterateAll()
          .forEach(
              rows -> {
                rows.forEach(row -> System.out.println("row: " + row.toString()));
              });

      System.out.println("Successfully relaxed all columns in destination table during query job");
    } catch (BigQueryException | InterruptedException e) {
      System.out.println("Columns not relaxed during query job \n" + e.toString());
    }
  }
}

Node.js

Antes de experimentar este exemplo, siga as Node.jsinstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Node.js 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 the Google Cloud client libraries
const {BigQuery} = require('@google-cloud/bigquery');

// Instantiate client
const bigquery = new BigQuery();

async function addColumnQueryAppend() {
  // Adds a new column to a BigQuery table while appending rows via a query job.

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const datasetId = 'my_dataset';
  // const tableId = 'my_table';

  // Retrieve destination table reference
  const [table] = await bigquery
    .dataset(datasetId)
    .table(tableId)
    .get();
  const destinationTableRef = table.metadata.tableReference;

  // In this example, the existing table contains only the 'name' column.
  // 'REQUIRED' fields cannot  be added to an existing schema,
  // so the additional column must be 'NULLABLE'.
  const query = `SELECT name, year
    FROM \`bigquery-public-data.usa_names.usa_1910_2013\`
    WHERE state = 'TX'
    LIMIT 10`;

  // Set load job options
  const options = {
    query: query,
    schemaUpdateOptions: ['ALLOW_FIELD_ADDITION'],
    writeDisposition: 'WRITE_APPEND',
    destinationTable: destinationTableRef,
    // Location must match that of the dataset(s) referenced in the query.
    location: 'US',
  };

  const [job] = await bigquery.createQueryJob(options);
  console.log(`Job ${job.id} started.`);

  // Wait for the query to finish
  const [rows] = await job.getQueryResults();
  console.log(`Job ${job.id} completed.`);

  // Print the results
  console.log('Rows:');
  rows.forEach(row => console.log(row));
}

Python

Antes de experimentar este exemplo, siga as Pythoninstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Python 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.

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set table_id to the ID of the destination table.
# table_id = "your-project.your_dataset.your_table_name"

# Retrieves the destination table and checks the length of the schema.
table = client.get_table(table_id)  # Make an API request.
print("Table {} contains {} columns".format(table_id, len(table.schema)))

# Configures the query to append the results to a destination table,
# allowing field addition.
job_config = bigquery.QueryJobConfig(
    destination=table_id,
    schema_update_options=[bigquery.SchemaUpdateOption.ALLOW_FIELD_ADDITION],
    write_disposition=bigquery.WriteDisposition.WRITE_APPEND,
)

# Start the query, passing in the extra configuration.
client.query_and_wait(
    # In this example, the existing table contains only the 'full_name' and
    # 'age' columns, while the results of this query will contain an
    # additional 'favorite_color' column.
    'SELECT "Timmy" as full_name, 85 as age, "Blue" as favorite_color;',
    job_config=job_config,
)  # Make an API request and wait for job to complete.

# Checks the updated length of the schema.
table = client.get_table(table_id)  # Make an API request.
print("Table {} now contains {} columns".format(table_id, len(table.schema)))

Altere o nome de uma coluna

Para mudar o nome de uma coluna numa tabela, use a ALTER TABLE RENAME COLUMN declaração DDL. O exemplo seguinte muda o nome da coluna old_name para new_name em mytable:

ALTER TABLE mydataset.mytable
  RENAME COLUMN old_name TO new_name;

Para mais informações sobre os extratos ALTER TABLE RENAME COLUMN, consulte os detalhes de DDL.

Altere o tipo de dados de uma coluna

A alteração do tipo de dados de uma coluna não é suportada pela Trusted Cloud consola, pela ferramenta de linha de comandos bq nem pela API BigQuery. Se tentar atualizar uma tabela aplicando um esquema que especifique um novo tipo de dados para uma coluna, é devolvido um erro.

Altere o tipo de dados de uma coluna com uma declaração DDL

Pode usar o GoogleSQL para fazer determinadas alterações ao tipo de dados de uma coluna. Para mais informações e uma lista completa das conversões de tipos de dados suportadas, consulte a ALTER COLUMN SET DATA TYPE declaração DDL.

O exemplo seguinte cria uma tabela com uma coluna do tipo INT64 e, em seguida, atualiza o tipo para NUMERIC:

CREATE TABLE mydataset.mytable(c1 INT64);

ALTER TABLE mydataset.mytable
ALTER COLUMN c1 SET DATA TYPE NUMERIC;

O exemplo seguinte cria uma tabela com uma coluna aninhada com dois campos e, em seguida, atualiza o tipo de uma das colunas de INT para NUMERIC:

CREATE TABLE mydataset.mytable(s1 STRUCT<a INT64, b STRING>);

ALTER TABLE mydataset.mytable ALTER COLUMN s1
SET DATA TYPE STRUCT<a NUMERIC, b STRING>;

Modifique os tipos de colunas aninhadas

Para alterações complexas de esquemas aninhados, como alterar um campo numa matriz de STRUCTs, a declaração DDL ALTER TABLE não é suportada. Como solução alternativa, pode usar a declaração CREATE OR REPLACE TABLE com uma declaração SELECT para transformar as alterações do esquema aninhado.

O exemplo seguinte demonstra como transformar uma coluna numa matriz de STRUCTS:

Considere uma tabela samples.test com o seguinte esquema e dados:

CREATE OR REPLACE TABLE
  samples.test(D STRUCT <L ARRAY<STRUCT<R STRING, U STRING, V STRING>>, F STRING>);

INSERT INTO
  samples.test(D)
VALUES
  (STRUCT([STRUCT("r1", "u1", "v1"), STRUCT("r2", "u2", "v2")], "f1"));

O resultado tem um aspeto semelhante ao seguinte:

+----------------------------------------------------------------------------+
|                                     D                                      |
+----------------------------------------------------------------------------+
| {"L":[{"R":"r1","U":"u1","V":"v1"},{"R":"r2","U":"u2","V":"v2"}],"F":"f1"} |
+----------------------------------------------------------------------------+

Suponhamos que precisa de alterar o tipo de campo U na matriz aninhada de STRUCTs para STRUCT<W STRING>. A seguinte declaração SQL demonstra como conseguir isto:

CREATE OR REPLACE TABLE
  samples.new_table AS
SELECT
  STRUCT(ARRAY(
    SELECT
      STRUCT(tmp.R,
        STRUCT(tmp.U AS W) AS U,
        tmp.V)
    FROM
      UNNEST(t.D.L) AS tmp) AS L,
    t.D.F) AS D
FROM
  samples.test AS t

Esta declaração cria uma nova tabela, samples.new_table, com o esquema de destino. A função UNNEST expande a matriz de STRUCTs em t.D.L. A expressão STRUCT(tmp.U AS W) AS U constrói o novo STRUCT com o campo W, preenchido com o valor do campo U original. A tabela resultante, samples.new_table, tem o seguinte esquema e dados:

+----------------------------------------------------------------------------------------+
|                                           D                                            |
+----------------------------------------------------------------------------------------+
| {"L":[{"R":"r1","U":{"W":"u1"},"V":"v1"},{"R":"r2","U":{"W":"u2"},"V":"v2"}],"F":"f1"} |
+----------------------------------------------------------------------------------------+

Converter o tipo de dados de uma coluna

Para alterar o tipo de dados de uma coluna para um tipo convertível, use uma consulta SQL para selecionar os dados da tabela, converter a coluna relevante e substituir a tabela. A transmissão e a substituição não são recomendadas para tabelas muito grandes, porque requerem uma análise completa da tabela.

O exemplo seguinte mostra uma consulta SQL que seleciona todos os dados de column_two e column_three em mydataset.mytable e converte column_one de DATE para STRING. O resultado da consulta é usado para substituir a tabela existente. A tabela substituída armazena column_one como um tipo de dados STRING.

Quando usa CAST, uma consulta pode falhar se o BigQuery não conseguir executar a conversão. Para ver detalhes sobre as regras de conversão no GoogleSQL, consulte o artigo Conversão.

Consola

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

    Aceda ao BigQuery

  2. No editor de consultas, introduza a seguinte consulta para selecionar todos os dados de column_two e column_three em mydataset.mytable e para converter column_one de DATE em STRING. A consulta usa um alias para converter column_one com o mesmo nome. mydataset.mytable está no seu projeto predefinido.

    SELECT
     column_two,
     column_three,
     CAST(column_one AS STRING) AS column_one
    FROM
     mydataset.mytable;
  3. Clique em Mais e selecione Definições de consulta.

  4. Na secção Destino, faça o seguinte:

    1. Selecione Definir uma tabela de destino para os resultados da consulta.

    2. Para Nome do projeto, deixe o valor definido para o seu projeto predefinido. Este é o projeto que contém mydataset.mytable.

    3. Para Conjunto de dados, escolha mydataset.

    4. No campo ID da tabela, introduza mytable.

    5. Em Preferência de escrita da tabela de destino, selecione Substituir tabela. Esta opção substitui mytable pelos resultados da consulta.

  5. Opcionalmente, escolha a localização dos seus dados.

  6. Para atualizar as definições, clique em Guardar.

  7. Clique em Executar.

    Quando a tarefa de consulta estiver concluída, o tipo de dados de column_one é STRING.

bq

Introduza o comando bq query seguinte para selecionar todos os dados de column_two e column_three em mydataset.mytable e para transmitir column_one de DATE para STRING. A consulta usa um alias para converter o tipo de dados column_one com o mesmo nome. mydataset.mytable está no seu projeto predefinido.

Os resultados da consulta são escritos em mydataset.mytable através da flag --destination_table, e a flag --replace é usada para substituir mytable. Especifique o sinalizador use_legacy_sql=false para usar a sintaxe do GoogleSQL.

Opcionalmente, forneça o sinalizador --location e defina o valor para a sua localização.

bq query \
    --destination_table mydataset.mytable \
    --replace \
    --use_legacy_sql=false \
'SELECT
  column_two,
  column_three,
  CAST(column_one AS STRING) AS column_one
FROM
  mydataset.mytable'

API

Para selecionar todos os dados de column_two e column_three em mydataset.mytable e transmitir column_one de DATE para STRING, chame o método jobs.insert e configure uma tarefa query. Opcionalmente, especifique a sua localização na propriedade location na secção jobReference.

A consulta SQL usada na tarefa de consulta seria SELECT column_two, column_three, CAST(column_one AS STRING) AS column_one FROM mydataset.mytable. A consulta usa um alias para converter column_one com o mesmo nome.

Para substituir mytable pelos resultados da consulta, inclua mydataset.mytable na propriedade configuration.query.destinationTable e especifique WRITE_TRUNCATE na propriedade configuration.query.writeDisposition.

Altere o modo de uma coluna

A única modificação suportada que pode fazer ao modo de uma coluna é alterá-lo de REQUIRED para NULLABLE. A alteração do modo de uma coluna de REQUIRED para NULLABLE também é denominada relaxamento da coluna. Também pode relaxar uma coluna quando carrega dados para substituir uma tabela existente ou quando anexa dados a uma tabela existente. Não pode alterar o modo de uma coluna de NULLABLE para REQUIRED.

Crie uma coluna NULLABLE numa tabela existente

Para alterar o modo de uma coluna de REQUIRED para NULLABLE, selecione uma das seguintes opções:

Consola

  1. Aceda à página do BigQuery.

    Aceda ao BigQuery

  2. No painel Explorador, expanda o projeto e o conjunto de dados e, de seguida, selecione a tabela.

  3. No painel de detalhes, clique no separador Esquema.

  4. Clique em Editar esquema. Pode ter de deslocar a página para ver este botão.

  5. Na página Esquema atual, localize o campo que quer alterar.

  6. Na lista pendente Modo desse campo, selecione NULLABLE.

  7. Para atualizar as definições, clique em Guardar.

SQL

Use a ALTER COLUMN DROP NOT NULL declaração DDL. O exemplo seguinte altera o modo da coluna mycolumn de REQUIRED para NULLABLE:

  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
    ALTER COLUMN mycolumn
    DROP NOT NULL;

  3. Clique em Executar.

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

bq

  1. Primeiro, execute o comando bq show com a flag --schema e escreva o esquema da tabela existente num ficheiro. Se a tabela que está a atualizar estiver num projeto diferente do projeto predefinido, adicione o ID do projeto ao nome do conjunto de dados no seguinte formato: PROJECT_ID:DATASET.

    bq show \
    --schema \
    --format=prettyjson \
    PROJECT_ID:DATASET.TABLE > SCHEMA_FILE

    Substitua o seguinte:

    • 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.
    • SCHEMA_FILE: o ficheiro de definição do esquema escrito no seu computador local.

    Por exemplo, para escrever a definição do esquema de mydataset.mytable num ficheiro, introduza o seguinte comando. mydataset.mytable está no seu projeto predefinido.

      bq show \
      --schema \
      --format=prettyjson \
      mydataset.mytable > /tmp/myschema.json
    
  2. Abra o ficheiro de esquema num editor de texto. O esquema deve ter o seguinte aspeto:

    [
      {
        "mode": "REQUIRED",
        "name": "column1",
        "type": "STRING"
      },
      {
        "mode": "REQUIRED",
        "name": "column2",
        "type": "FLOAT"
      },
      {
        "mode": "REPEATED",
        "name": "column3",
        "type": "STRING"
      }
    ]
    
  3. Altere o modo de uma coluna existente de REQUIRED para NULLABLE. Neste exemplo, o modo para column1 é flexível.

    [
      {
        "mode": "NULLABLE",
        "name": "column1",
        "type": "STRING"
      },
      {
        "mode": "REQUIRED",
        "name": "column2",
        "type": "FLOAT"
      },
      {
        "mode": "REPEATED",
        "name": "column3",
        "type": "STRING"
      }
    ]
    

    Para mais informações sobre como trabalhar com ficheiros de esquema JSON, consulte o artigo Especificar um ficheiro de esquema JSON.

  4. Depois de atualizar o ficheiro de esquema, execute o seguinte comando para atualizar o esquema da tabela. Se a tabela que está a atualizar estiver num projeto diferente do projeto predefinido, adicione o ID do projeto ao nome do conjunto de dados no seguinte formato: PROJECT_ID:DATASET.

    bq update PROJECT_ID:DATASET.TABLE SCHEMA

    Substitua o seguinte:

    • 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.
    • SCHEMA: o caminho para o ficheiro de esquema JSON no seu computador local.

    Por exemplo, introduza o seguinte comando para atualizar a definição do esquema de mydataset.mytable no seu projeto predefinido. O caminho para o ficheiro de esquema na sua máquina local é /tmp/myschema.json.

      bq update mydataset.mytable /tmp/myschema.json
    

API

Chame tables.patch e use a propriedade schema para alterar uma coluna REQUIRED para NULLABLE na definição do esquema. Uma vez que o método tables.update substitui o recurso de tabela completo, o método tables.patch é preferível.

Go

Antes de experimentar este exemplo, siga as Goinstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Go 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 (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// relaxTableAPI demonstrates modifying the schema of a table to remove the requirement that columns allow
// no NULL values.
func relaxTableAPI(projectID, datasetID, tableID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydatasetid"
	// tableID := "mytableid"
	ctx := context.Background()

	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	// Setup: We first create a table with a schema that's restricts NULL values.
	sampleSchema := bigquery.Schema{
		{Name: "full_name", Type: bigquery.StringFieldType, Required: true},
		{Name: "age", Type: bigquery.IntegerFieldType, Required: true},
	}
	original := &bigquery.TableMetadata{
		Schema: sampleSchema,
	}
	if err := client.Dataset(datasetID).Table(tableID).Create(ctx, original); err != nil {
		return err
	}

	tableRef := client.Dataset(datasetID).Table(tableID)
	meta, err := tableRef.Metadata(ctx)
	if err != nil {
		return err
	}
	// Iterate through the schema to set all Required fields to false (nullable).
	var relaxed bigquery.Schema
	for _, v := range meta.Schema {
		v.Required = false
		relaxed = append(relaxed, v)
	}
	newMeta := bigquery.TableMetadataToUpdate{
		Schema: relaxed,
	}
	if _, err := tableRef.Update(ctx, newMeta, meta.ETag); err != nil {
		return err
	}
	return nil
}

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.Field;
import com.google.cloud.bigquery.LegacySQLTypeName;
import com.google.cloud.bigquery.Schema;
import com.google.cloud.bigquery.StandardTableDefinition;
import com.google.cloud.bigquery.Table;

public class RelaxColumnMode {

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

  public static void relaxColumnMode(String datasetName, String tableId) {
    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, tableId);

      // Create new relaxed schema based on the existing table schema
      Schema relaxedSchema =
          Schema.of(
              // The only supported modification you can make to a column's mode is changing it from
              // REQUIRED to NULLABLE
              // Changing a column's mode from REQUIRED to NULLABLE is also called column relaxation
              // INFO: LegacySQLTypeName will be updated to StandardSQLTypeName in release 1.103.0
              Field.newBuilder("word", LegacySQLTypeName.STRING)
                  .setMode(Field.Mode.NULLABLE)
                  .build(),
              Field.newBuilder("word_count", LegacySQLTypeName.STRING)
                  .setMode(Field.Mode.NULLABLE)
                  .build(),
              Field.newBuilder("corpus", LegacySQLTypeName.STRING)
                  .setMode(Field.Mode.NULLABLE)
                  .build(),
              Field.newBuilder("corpus_date", LegacySQLTypeName.STRING)
                  .setMode(Field.Mode.NULLABLE)
                  .build());

      // Update the table with the new schema
      Table updatedTable =
          table.toBuilder().setDefinition(StandardTableDefinition.of(relaxedSchema)).build();
      updatedTable.update();
      System.out.println("Table schema successfully relaxed.");
    } catch (BigQueryException e) {
      System.out.println("Table schema not relaxed \n" + e.toString());
    }
  }
}

Node.js

Antes de experimentar este exemplo, siga as Node.jsinstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Node.js 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 the Google Cloud client library and create a client
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();

async function relaxColumn() {
  /**
   * Changes columns from required to nullable.
   * Assumes existing table with the following schema:
   * [{name: 'Name', type: 'STRING', mode: 'REQUIRED'},
   * {name: 'Age', type: 'INTEGER'},
   * {name: 'Weight', type: 'FLOAT'},
   * {name: 'IsMagic', type: 'BOOLEAN'}];
   */

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const datasetId = 'my_dataset';
  // const tableId = 'my_table';

  const newSchema = [
    {name: 'Name', type: 'STRING', mode: 'NULLABLE'},
    {name: 'Age', type: 'INTEGER'},
    {name: 'Weight', type: 'FLOAT'},
    {name: 'IsMagic', type: 'BOOLEAN'},
  ];

  // Retrieve current table metadata
  const table = bigquery.dataset(datasetId).table(tableId);
  const [metadata] = await table.getMetadata();

  // Update schema
  metadata.schema = newSchema;
  const [apiResponse] = await table.setMetadata(metadata);

  console.log(apiResponse.schema.fields);
}

Python

Antes de experimentar este exemplo, siga as Pythoninstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Python 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.

Substitua a propriedade Table.schema por uma lista de objetos SchemaField com a propriedade mode definida como 'NULLABLE'

from google.cloud import bigquery

client = bigquery.Client()

# TODO(dev): Change table_id to full name of the table you want to create.
table_id = "your-project.your_dataset.your_table"

table = client.get_table(table_id)
new_schema = []
for field in table.schema:
    if field.mode != "REQUIRED":
        new_schema.append(field)
    else:
        # SchemaField properties cannot be edited after initialization.
        # To make changes, construct new SchemaField objects.
        new_field = field.to_api_repr()
        new_field["mode"] = "NULLABLE"
        relaxed_field = bigquery.SchemaField.from_api_repr(new_field)
        new_schema.append(relaxed_field)

table.schema = new_schema
table = client.update_table(table, ["schema"])

print(f"Updated {table_id} schema: {table.schema}.")

Crie uma coluna NULLABLE com uma tarefa de carregamento de anexação

Pode relaxar o modo de uma coluna quando anexa dados a uma tabela num trabalho de carregamento. Selecione uma das seguintes opções com base no tipo de ficheiro:

  • Quando acrescenta dados de ficheiros CSV e JSON, relaxe o modo para colunas individuais especificando um ficheiro de esquema JSON.
  • Quando acrescenta dados de ficheiros Avro, ORC ou Parquet, relaxe as colunas no esquema e permita que a inferência de esquemas detete as colunas relaxadas.NULL

Para relaxar uma coluna de REQUIRED para NULLABLE quando anexa dados a uma tabela durante uma tarefa de carregamento, selecione uma das seguintes opções:

Consola

Não pode relaxar o modo de uma coluna através da Trusted Cloud consola.

bq

Use o comando bq load para carregar os dados e especifique a flag --noreplace para indicar que está a anexar os dados a uma tabela existente.

Se os dados que está a anexar estiverem no formato CSV ou JSON delimitado por nova linha, especifique as colunas flexíveis num ficheiro de esquema JSON local ou use a flag --autodetect para usar a deteção de esquemas para descobrir colunas flexíveis nos dados de origem.

As colunas relaxadas podem ser inferidas automaticamente a partir de ficheiros Avro, ORC e Parquet. O relaxamento de colunas não se aplica a anexos de exportação do Datastore. As colunas nas tabelas criadas através do carregamento de ficheiros de exportação do Datastore são sempre NULLABLE.

Defina a flag --schema_update_option como ALLOW_FIELD_RELAXATION para indicar que os dados que está a acrescentar contêm colunas flexíveis.

Se a tabela que está a acrescentar estiver num conjunto de dados num projeto diferente do seu projeto predefinido, adicione o ID do projeto ao nome do conjunto de dados no seguinte formato: PROJECT_ID:DATASET.

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

Introduza o comando load da seguinte forma:

bq --location=LOCATION load \
--noreplace \
--schema_update_option=ALLOW_FIELD_RELAXATION \
--source_format=FORMAT \
PROJECT_ID:DATASET.TABLE \
PATH_TO_SOURCE \
SCHEMA

Substitua o seguinte:

  • 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, defina o valor da flag como asia-northeast1. Pode definir um valor predefinido para a localização através do ficheiro.bigqueryrc.
  • FORMAT: NEWLINE_DELIMITED_JSON, CSV, PARQUET, ORC ou AVRO. Os ficheiros DATASTORE_BACKUP não requerem a flexibilização de colunas. As colunas nas tabelas criadas a partir de ficheiros de exportação do Datastore são sempre NULLABLE.
  • PROJECT_ID: o ID do seu projeto.
  • dataset é o nome do conjunto de dados que contém a tabela.
  • TABLE: o nome da tabela à qual está a anexar dados.
  • PATH_TO_SOURCE: um URI do Cloud Storage> totalmente qualificado, uma lista de URIs separados por vírgulas ou o caminho para um ficheiro de dados na sua máquina local.
  • SCHEMA: o caminho para um ficheiro de esquema JSON local. Esta opção é usada apenas para ficheiros CSV e JSON. As colunas flexíveis são inferidas automaticamente a partir de ficheiros Avro.

Exemplos:

Introduza o seguinte comando para anexar um ficheiro de dados Avro local, /tmp/mydata.avro, a mydataset.mytable através de uma tarefa de carregamento. Uma vez que as colunas flexíveis podem ser inferidas automaticamente a partir de dados Avro, não precisa de especificar um ficheiro de esquema. mydataset está no seu projeto predefinido.

bq load \
    --noreplace \
    --schema_update_option=ALLOW_FIELD_RELAXATION \
    --source_format=AVRO \
    mydataset.mytable \
    /tmp/mydata.avro

Introduza o seguinte comando para anexar dados de um ficheiro JSON delimitado por novas linhas no Cloud Storage a mydataset.mytable através de uma tarefa de carregamento. O esquema que contém as colunas flexíveis está num ficheiro de esquema JSON local: /tmp/myschema.json. mydataset está no seu projeto predefinido.

bq load \
--noreplace \
--schema_update_option=ALLOW_FIELD_RELAXATION \
--source_format=NEWLINE_DELIMITED_JSON \
mydataset.mytable \
gs://mybucket/mydata.json \
/tmp/myschema.json

Introduza o seguinte comando para anexar dados num ficheiro CSV no seu computador local mydataset.mytable usando uma tarefa de carregamento. O comando usa a deteção automática do esquema para descobrir colunas flexíveis nos dados de origem. mydataset está em myotherproject e não no seu projeto predefinido.

bq load \
--noreplace \
--schema_update_option=ALLOW_FIELD_RELAXATION \
--source_format=CSV \
--autodetect \
myotherproject:mydataset.mytable \
mydata.csv

API

Chame o método jobs.insert. Configure uma tarefa load e defina as seguintes propriedades:

  • Faça referência aos seus dados no Cloud Storage através da propriedade sourceUris.
  • Especifique o formato de dados definindo a propriedade sourceFormat.
  • Especifique o esquema na propriedade schema.
  • Especifique a opção de atualização do esquema através da propriedade schemaUpdateOptions.
  • Defina a disposição de escrita da tabela de destino para WRITE_APPEND usando a propriedade writeDisposition.

Go

Antes de experimentar este exemplo, siga as Goinstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Go 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 (
	"context"
	"fmt"
	"os"

	"cloud.google.com/go/bigquery"
)

// relaxTableImport demonstrates amending the schema of a table to relax columns from
// not allowing NULL values to allowing them.
func relaxTableImport(projectID, datasetID, tableID, filename string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// tableID := "mytable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	sampleSchema := bigquery.Schema{
		{Name: "full_name", Type: bigquery.StringFieldType, Required: true},
		{Name: "age", Type: bigquery.IntegerFieldType, Required: true},
	}
	meta := &bigquery.TableMetadata{
		Schema: sampleSchema,
	}
	tableRef := client.Dataset(datasetID).Table(tableID)
	if err := tableRef.Create(ctx, meta); err != nil {
		return err
	}
	// Now, import data from a local file, but specify relaxation of required
	// fields as a side effect while the data is appended.
	f, err := os.Open(filename)
	if err != nil {
		return err
	}
	source := bigquery.NewReaderSource(f)
	source.AutoDetect = true   // Allow BigQuery to determine schema.
	source.SkipLeadingRows = 1 // CSV has a single header line.

	loader := client.Dataset(datasetID).Table(tableID).LoaderFrom(source)
	loader.SchemaUpdateOptions = []string{"ALLOW_FIELD_RELAXATION"}
	job, err := loader.Run(ctx)
	if err != nil {
		return err
	}
	status, err := job.Wait(ctx)
	if err != nil {
		return err
	}
	if err := status.Err(); err != nil {
		return err
	}
	return nil
}

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.CsvOptions;
import com.google.cloud.bigquery.Field;
import com.google.cloud.bigquery.Job;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.LoadJobConfiguration;
import com.google.cloud.bigquery.Schema;
import com.google.cloud.bigquery.StandardSQLTypeName;
import com.google.cloud.bigquery.Table;
import com.google.cloud.bigquery.TableId;
import com.google.common.collect.ImmutableList;

// Sample to append relax column in a table.
public class RelaxColumnLoadAppend {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    String sourceUri = "gs://cloud-samples-data/bigquery/us-states/us-states.csv";
    relaxColumnLoadAppend(datasetName, tableName, sourceUri);
  }

  public static void relaxColumnLoadAppend(String datasetName, String tableName, String sourceUri) {
    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();

      // Retrieve destination table reference
      Table table = bigquery.getTable(TableId.of(datasetName, tableName));

      // column as a 'REQUIRED' field.
      Field name =
          Field.newBuilder("name", StandardSQLTypeName.STRING).setMode(Field.Mode.REQUIRED).build();
      Field postAbbr =
          Field.newBuilder("post_abbr", StandardSQLTypeName.STRING)
              .setMode(Field.Mode.REQUIRED)
              .build();
      Schema schema = Schema.of(name, postAbbr);

      // Skip header row in the file.
      CsvOptions csvOptions = CsvOptions.newBuilder().setSkipLeadingRows(1).build();

      // Set job options
      LoadJobConfiguration loadConfig =
          LoadJobConfiguration.newBuilder(table.getTableId(), sourceUri)
              .setSchema(schema)
              .setFormatOptions(csvOptions)
              .setSchemaUpdateOptions(
                  ImmutableList.of(JobInfo.SchemaUpdateOption.ALLOW_FIELD_RELAXATION))
              .setWriteDisposition(JobInfo.WriteDisposition.WRITE_APPEND)
              .build();

      // Create a load job and wait for it to complete.
      Job job = bigquery.create(JobInfo.of(loadConfig));
      job = job.waitFor();
      // Check the job's status for errors
      if (job.isDone() && job.getStatus().getError() == null) {
        System.out.println("Relax column append successfully loaded in a table");
      } else {
        System.out.println(
            "BigQuery was unable to load into the table due to an error:"
                + job.getStatus().getError());
      }
    } catch (BigQueryException | InterruptedException e) {
      System.out.println("Column not added during load append \n" + e.toString());
    }
  }
}

Node.js

Antes de experimentar este exemplo, siga as Node.jsinstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Node.js 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 the Google Cloud client libraries
const {BigQuery} = require('@google-cloud/bigquery');

// Instantiate client
const bigquery = new BigQuery();

async function relaxColumnLoadAppend() {
  // Changes required column to nullable in load append job.

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const fileName = '/path/to/file.csv';
  // const datasetId = 'my_dataset';
  // const tableId = 'my_table';

  // In this example, the existing table contains the 'Name'
  // column as a 'REQUIRED' field.
  const schema = 'Age:INTEGER, Weight:FLOAT, IsMagic:BOOLEAN';

  // Retrieve destination table reference
  const [table] = await bigquery
    .dataset(datasetId)
    .table(tableId)
    .get();
  const destinationTableRef = table.metadata.tableReference;

  // Set load job options
  const options = {
    schema: schema,
    schemaUpdateOptions: ['ALLOW_FIELD_RELAXATION'],
    writeDisposition: 'WRITE_APPEND',
    destinationTable: destinationTableRef,
  };

  // Load data from a local file into the table
  const [job] = await bigquery
    .dataset(datasetId)
    .table(tableId)
    .load(fileName, options);

  console.log(`Job ${job.id} completed.`);

  // Check the job's status for errors
  const errors = job.status.errors;
  if (errors && errors.length > 0) {
    throw errors;
  }
}

Python

Antes de experimentar este exemplo, siga as Pythoninstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Python 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.

# from google.cloud import bigquery
# client = bigquery.Client()
# project = client.project
# dataset_ref = bigquery.DatasetReference(project, 'my_dataset')
# filepath = 'path/to/your_file.csv'

# Retrieves the destination table and checks the number of required fields
table_id = "my_table"
table_ref = dataset_ref.table(table_id)
table = client.get_table(table_ref)
original_required_fields = sum(field.mode == "REQUIRED" for field in table.schema)
# In this example, the existing table has 3 required fields.
print("{} fields in the schema are required.".format(original_required_fields))

# Configures the load job to append the data to a destination table,
# allowing field relaxation
job_config = bigquery.LoadJobConfig()
job_config.write_disposition = bigquery.WriteDisposition.WRITE_APPEND
job_config.schema_update_options = [
    bigquery.SchemaUpdateOption.ALLOW_FIELD_RELAXATION
]
# In this example, the existing table contains three required fields
# ('full_name', 'age', and 'favorite_color'), while the data to load
# contains only the first two fields.
job_config.schema = [
    bigquery.SchemaField("full_name", "STRING", mode="REQUIRED"),
    bigquery.SchemaField("age", "INTEGER", mode="REQUIRED"),
]
job_config.source_format = bigquery.SourceFormat.CSV
job_config.skip_leading_rows = 1

with open(filepath, "rb") as source_file:
    job = client.load_table_from_file(
        source_file,
        table_ref,
        location="US",  # Must match the destination dataset location.
        job_config=job_config,
    )  # API request

job.result()  # Waits for table load to complete.
print(
    "Loaded {} rows into {}:{}.".format(
        job.output_rows, dataset_id, table_ref.table_id
    )
)

# Checks the updated number of required fields
table = client.get_table(table)
current_required_fields = sum(field.mode == "REQUIRED" for field in table.schema)
print("{} fields in the schema are now required.".format(current_required_fields))

Torne todas as colunas NULLABLE com uma tarefa de anexação

Pode relaxar todas as colunas numa tabela quando lhe anexa resultados de consultas. Pode relaxar todos os campos obrigatórios na tabela de destino definindo a flag --schema_update_option como ALLOW_FIELD_RELAXATION. Não pode relaxar colunas individuais numa tabela de destino através de uma anexação de consulta. Para relaxar colunas individuais com uma tarefa de anexação de carregamento, consulte Crie uma coluna NULLABLE com uma tarefa de anexação.

Para relaxar todas as colunas quando acrescenta resultados de consultas a uma tabela de destino, selecione uma das seguintes opções:

Consola

Não pode relaxar o modo de uma coluna através da Trusted Cloud consola.

bq

Use o comando bq query para consultar os seus dados e especifique a flag --destination_table para indicar a tabela à qual está a anexar.

Para especificar que está a anexar resultados da consulta a uma tabela de destino existente, especifique a flag --append_table.

Defina a flag --schema_update_option como ALLOW_FIELD_RELAXATION para indicar que todas as colunas REQUIRED na tabela que está a anexar devem ser alteradas para NULLABLE.

Especifique a flag use_legacy_sql=false para usar a sintaxe GoogleSQL para a consulta.

Se a tabela que está a acrescentar estiver num conjunto de dados num projeto diferente do seu projeto predefinido, adicione o ID do projeto ao nome do conjunto 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 query \
--destination_table PROJECT_ID:DATASET.TABLE \
--append_table \
--schema_update_option=ALLOW_FIELD_RELAXATION \
--use_legacy_sql=false \
'QUERY'

Substitua o seguinte:

  • 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, defina o valor da flag como asia-northeast1. Pode definir um valor predefinido para a localização através do ficheiro.bigqueryrc.
  • PROJECT_ID: o ID do seu projeto.
  • DATASET: o nome do conjunto de dados que contém a tabela que está a anexar.
  • TABLE: o nome da tabela que está a anexar.
  • QUERY: uma consulta na sintaxe GoogleSQL.

Exemplos:

Introduza a seguinte consulta de comando mydataset.mytable no seu projeto predefinido para anexar os resultados da consulta a mydataset.mytable2 (também no seu projeto predefinido). O comando altera todas as colunas REQUIRED na tabela de destino para NULLABLE.

bq query \
    --destination_table mydataset.mytable2 \
    --append_table \
    --schema_update_option=ALLOW_FIELD_RELAXATION \
    --use_legacy_sql=false \
    'SELECT
       column1,column2
     FROM
       mydataset.mytable'

Introduza a seguinte consulta de comando mydataset.mytable no seu projeto predefinido e para anexar os resultados da consulta a mydataset.mytable2 em myotherproject. O comando altera todas as colunas REQUIRED na tabela de destino para NULLABLE.

bq query \
--destination_table myotherproject:mydataset.mytable2 \
--append_table \
--schema_update_option=ALLOW_FIELD_RELAXATION \
--use_legacy_sql=false \
'SELECT
   column1,column2
 FROM
   mydataset.mytable'

API

Chame o método jobs.insert. Configure uma tarefa query e defina as seguintes propriedades:

  • Especifique a tabela de destino através da propriedade destinationTable.
  • Defina a disposição de escrita da tabela de destino para WRITE_APPEND usando a propriedade writeDisposition.
  • Especifique a opção de atualização do esquema através da propriedade schemaUpdateOptions.
  • Especifique a consulta GoogleSQL através da propriedade query.

Go

Antes de experimentar este exemplo, siga as Goinstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Go 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 (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// relaxTableQuery demonstrates relaxing the schema of a table by appending query results to
// enable the table to allow NULL values.
func relaxTableQuery(projectID, datasetID, tableID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// tableID := "mytable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	sampleSchema := bigquery.Schema{
		{Name: "full_name", Type: bigquery.StringFieldType, Required: true},
		{Name: "age", Type: bigquery.IntegerFieldType, Required: true},
	}
	meta := &bigquery.TableMetadata{
		Schema: sampleSchema,
	}
	tableRef := client.Dataset(datasetID).Table(tableID)
	if err := tableRef.Create(ctx, meta); err != nil {
		return err
	}
	// Now, append a query result that includes nulls, but allow the job to relax
	// all required columns.
	q := client.Query("SELECT \"Beyonce\" as full_name")
	q.QueryConfig.Dst = client.Dataset(datasetID).Table(tableID)
	q.SchemaUpdateOptions = []string{"ALLOW_FIELD_RELAXATION"}
	q.WriteDisposition = bigquery.WriteAppend
	q.Location = "US"
	job, err := q.Run(ctx)
	if err != nil {
		return err
	}
	_, err = job.Wait(ctx)
	if err != nil {
		return err
	}
	return nil
}

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.Job;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.JobInfo.SchemaUpdateOption;
import com.google.cloud.bigquery.JobInfo.WriteDisposition;
import com.google.cloud.bigquery.QueryJobConfiguration;
import com.google.cloud.bigquery.TableId;
import com.google.cloud.bigquery.TableResult;
import com.google.common.collect.ImmutableList;

public class RelaxTableQuery {

  public static void runRelaxTableQuery() throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "MY_PROJECT_ID";
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    relaxTableQuery(projectId, datasetName, tableName);
  }

  // To relax all columns in a destination table when you append data to it during a query job
  public static void relaxTableQuery(String projectId, String datasetName, String tableName)
      throws Exception {
    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();

      TableId tableId = TableId.of(datasetName, tableName);

      String sourceTable = "`" + projectId + "." + datasetName + "." + tableName + "`";
      String query = "SELECT word FROM " + sourceTable + " WHERE word like '%is%'";

      QueryJobConfiguration queryConfig =
          QueryJobConfiguration.newBuilder(query)
              // Use standard SQL syntax for queries.
              // See: https://cloud.google.com/bigquery/sql-reference/
              .setUseLegacySql(false)
              .setSchemaUpdateOptions(ImmutableList.of(SchemaUpdateOption.ALLOW_FIELD_RELAXATION))
              .setWriteDisposition(WriteDisposition.WRITE_APPEND)
              .setDestinationTable(tableId)
              .build();

      Job queryJob = bigquery.create(JobInfo.newBuilder(queryConfig).build());

      queryJob = queryJob.waitFor();

      // Check for errors
      if (queryJob == null) {
        throw new Exception("Job no longer exists");
      } else if (queryJob.getStatus().getError() != null) {
        // You can also look at queryJob.getStatus().getExecutionErrors() for all
        // errors, not just the latest one.
        throw new Exception(queryJob.getStatus().getError().toString());
      }

      // Get the results.
      TableResult results = queryJob.getQueryResults();

      // Print all pages of the results.
      results
          .iterateAll()
          .forEach(
              rows -> {
                rows.forEach(row -> System.out.println("row: " + row.toString()));
              });

      System.out.println("Successfully relaxed all columns in destination table during query job");
    } catch (BigQueryException | InterruptedException e) {
      System.out.println("Columns not relaxed during query job \n" + e.toString());
    }
  }
}

Python

Antes de experimentar este exemplo, siga as Pythoninstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Python 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.

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set table_id to the ID of the destination table.
# table_id = "your-project.your_dataset.your_table_name"

# Retrieves the destination table and checks the number of required fields.
table = client.get_table(table_id)  # Make an API request.
original_required_fields = sum(field.mode == "REQUIRED" for field in table.schema)

# In this example, the existing table has 2 required fields.
print("{} fields in the schema are required.".format(original_required_fields))

# Configures the query to append the results to a destination table,
# allowing field relaxation.
job_config = bigquery.QueryJobConfig(
    destination=table_id,
    schema_update_options=[bigquery.SchemaUpdateOption.ALLOW_FIELD_RELAXATION],
    write_disposition=bigquery.WriteDisposition.WRITE_APPEND,
)

# Start the query, passing in the extra configuration.
client.query_and_wait(
    # In this example, the existing table contains 'full_name' and 'age' as
    # required columns, but the query results will omit the second column.
    'SELECT "Beyonce" as full_name;',
    job_config=job_config,
)  # Make an API request and wait for job to complete

# Checks the updated number of required fields.
table = client.get_table(table_id)  # Make an API request.
current_required_fields = sum(field.mode == "REQUIRED" for field in table.schema)
print("{} fields in the schema are now required.".format(current_required_fields))

Altere o valor predefinido de uma coluna

Para alterar o valor predefinido de uma coluna, selecione uma das seguintes opções:

Consola

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

    Aceda ao BigQuery

  2. No painel Explorador, expanda o projeto e o conjunto de dados e, de seguida, selecione a tabela.

  3. No painel de detalhes, clique no separador Esquema.

  4. Clique em Editar esquema. Pode ter de deslocar a página para ver este botão.

  5. Na página Esquema atual, localize o campo de nível superior que quer alterar.

  6. Introduza o valor predefinido para esse campo.

  7. Clique em Guardar.

SQL

Use a ALTER COLUMN SET DEFAULT declaração DDL.

  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
    ALTER COLUMN column_name SET DEFAULT default_expression;

  3. Clique em Executar.

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

Altere a descrição de uma coluna

Para alterar a descrição de uma coluna, selecione uma das seguintes opções:

Consola

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

    Aceda ao BigQuery

  2. No painel Explorador, expanda o projeto e o conjunto de dados e, de seguida, selecione a tabela.

  3. No painel de detalhes, clique no separador Esquema.

  4. Clique em Editar esquema. Pode ter de deslocar a página para ver este botão.

  5. Na página Esquema atual, localize o campo que quer alterar.

  6. Introduza a descrição desse campo.

  7. Clique em Guardar.

SQL

Use a ALTER COLUMN SET OPTIONS declaração DDL.

  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
    ALTER COLUMN column_name
    SET OPTIONS (description = 'This is a column description.');

  3. Clique em Executar.

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

Gemini

Pode gerar descrições de colunas com o Gemini no BigQuery usando estatísticas de dados. As estatísticas de dados são uma forma automática de explorar, compreender e organizar os seus dados.

Para mais informações sobre as estatísticas de dados, incluindo os passos de configuração, as funções do IAM necessárias e as práticas recomendadas para melhorar a precisão das estatísticas geradas, consulte o artigo Gere estatísticas de dados no BigQuery.

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

    Aceda ao BigQuery

  2. No painel Explorador, expanda o projeto e o conjunto de dados e, de seguida, selecione a tabela.

  3. No painel de detalhes, clique no separador Esquema.

  4. Clique em Gerar.

    O Gemini gera descrições de colunas e estatísticas sobre a tabela. Demora alguns minutos até que as informações sejam preenchidas. Pode ver as estatísticas geradas no separador Estatísticas da tabela.

  5. Para editar e guardar as descrições de colunas geradas, faça o seguinte:

    1. Clique em Ver descrições das colunas.

    2. Na secção Descrições das colunas, clique em Guardar no esquema.

      As descrições das colunas geradas são preenchidas no campo Nova descrição para cada coluna.

    3. Edite as descrições das colunas conforme necessário e, de seguida, clique em Guardar.

      As descrições das colunas são atualizadas imediatamente.

    4. Para fechar o painel Pré-visualizar descrições, clique em Fechar.

Elimine uma coluna

Pode eliminar uma coluna de uma tabela existente através da ALTER TABLE DROP COLUMN declaração DDL.

A declaração não liberta imediatamente o armazenamento associado à coluna eliminada. Para saber mais sobre o impacto no armazenamento quando elimina uma coluna no armazenamento, consulte os ALTER TABLE DROP COLUMNdetalhes da declaração. Existem duas opções para reclamar imediatamente o armazenamento:

  • Substitua uma tabela com uma consulta SELECT * EXCEPT:

    CREATE OR REPLACE TABLE mydataset.mytable AS (
      SELECT * EXCEPT (column_to_delete) FROM mydataset.mytable
    );
    
  • Exporte os dados para o Cloud Storage, elimine as colunas indesejadas e, em seguida, carregue os dados para uma nova tabela com o esquema correto.