Alterar esquemas de tabela manualmente
Neste documento, descrevemos como alterar manualmente a definição do esquema para as tabelas atuais do BigQuery. Muitas alterações de esquema não têm suporte nativo no BigQuery e exigem soluções alternativas manuais. Essas modificações de esquema não aceitas incluem:
- Como alterar o nome de uma coluna.
- Alterar o tipo de dados de uma coluna.
- Alterar o modo de uma coluna, além de transformar colunas
REQUIRED
emNULLABLE
. - Excluir uma coluna.
Para mais informações sobre alterações de esquema compatíveis no BigQuery, consulte Como modificar esquemas de tabelas.
Alterar o nome de uma coluna
A renomeação de uma coluna não é compatível com o console do Google Cloud, com a ferramenta de linha de comando bq
ou com a API. Se você tentar atualizar um esquema de tabelas usando uma coluna renomeada, verá o seguinte erro:
BigQuery error in update operation: Provided Schema does not match Table
project_id:dataset.table
.
Há duas maneiras de renomear colunas manualmente:
- Com uma consulta SQL: escolha esta opção se estiver mais preocupado com a simplicidade e a facilidade de uso, e não com os custos.
- Com a recriação da tabela: escolha esta opção se você estiver mais preocupado com os custos, e não com a simplicidade e a facilidade de uso.
Opção 1: usar consultas
Para alterar o nome de uma coluna usando uma consulta SQL, selecione todas as colunas da tabela e atribua um alias à coluna que você precisa renomear. Você pode usar o resultado da consulta para substituir a tabela existente ou criar uma nova tabela de destino. Quando você atribui um alias à coluna com um novo nome, ele precisa aderir às regras do BigQuery para nomes de colunas.
Vantagens
- Usar uma consulta para gravar os dados em uma nova tabela de destino preserva os dados originais.
- Se você usar o job de consulta para substituir a tabela original, terá custos de armazenamento para uma tabela em vez de duas, mas perderá os dados originais.
Desvantagens
- Renomear uma coluna usando uma consulta requer a verificação da tabela inteira. É possível que as cobranças da consulta sejam elevadas se a tabela for muito grande.
- Se você gravar os resultados da consulta em uma nova tabela de destino, terá custos de armazenamento tanto para a tabela antiga como para a nova (a menos que você exclua a antiga).
- As colunas renomeadas que eram obrigatórias se tornam anuláveis.
Exemplo de alias de coluna
No exemplo a seguir, você verá uma consulta SQL padrão que seleciona todos os dados em mytable
, exceto as duas colunas que exigem renomeação. Um alias é usado para gerar novos nomes para as duas colunas. column_one
é renomeado como newcolumn_one
, e column_two
é renomeado como newcolumn_two
. O resultado da consulta é usado para substituir a tabela atual.
Console
No console do Google Cloud, selecione o Editor de consultas.
No Editor de consultas, insira a consulta a seguir para selecionar todos os dados em
mydataset.mytable
exceto pelas duas colunas que precisam ser renomeadas.mydataset.mytable
está no projeto padrão. Na consulta, é usado um alias para alterar o nome decolumn_one
paranewcolumn_one
e para alterar o nome decolumn_two
paranewcolumn_two
.SELECT * EXCEPT(column_one, column_two), column_one AS newcolumn_one, column_two AS newcolumn_two FROM mydataset.mytable
Clique em Mais e selecione Configurações de consulta.
Na seção Destino:
Selecione Definir uma tabela de destino para os resultados da consulta.
Em Conjunto de dados, escolha
myproject.mydataset
.Em ID da tabela, insira
mytable
.Em Preferência de gravação na tabela de destino, selecione em Substituir tabela. Isso substitui
mytable
usando os resultados da consulta.
Clique em Salvar para atualizar as configurações e, no Editor de consultas, clique em Executar. Quando o job de consulta for concluído, as colunas em
mytable
terão novos nomes.
bq
Digite o seguinte comando bq query
para selecionar todos os dados em mydataset.mytable
, exceto pelas duas colunas que precisam ser renomeadas.
mydataset.mytable
está no projeto padrão. Na consulta, é usado um alias para alterar o nome de column_one
para newcolumn_one
e para alterar o nome de column_two
para newcolumn_two
.
Grave os resultados da consulta em mydataset.mytable
usando a sinalização --destination_table
e especifique a sinalização --replace
para substituir mytable
. Especifique a sinalização use_legacy_sql=false
para usar a sintaxe SQL padrão.
Opcional: forneça a sinalização --location
e defina o valor do
local.
bq query \
--destination_table mydataset.mytable \
--replace \
--use_legacy_sql=false \
'SELECT
* EXCEPT(column_one,
column_two),
column_one AS newcolumn_one,
column_two AS newcolumn_two
FROM
mydataset.mytable'
API
Para alterar o nome de column_one
para newcolumn_one
e alterar o nome de column_two
para newcolumn_two
, chame o método jobs.insert
e configure um job query
. Opcional: especifique seu local na property location
da seção jobReference
.
A consulta SQL usada no job de consulta seria: SELECT * EXCEPT(column_one,
column_two), column_one AS newcolumn_one, column_two AS newcolumn_two FROM
mydataset.mytable
. Essa consulta seleciona todos os dados em mytable
, exceto duas colunas que exigem renomeação. Um alias é usado para gerar novos nomes para as duas colunas.
Para substituir mytable
pelos resultados da consulta, inclua mydataset.mytable
na property configuration.query.destinationTable
e especifique WRITE_TRUNCATE
na property configuration.query.writeDisposition
. Para especificar uma nova tabela de destino, insira o nome da tabela na property configuration.query.destinationTable
.
Opção 2: exportar e carregar dados em uma nova tabela
É possível renomear uma coluna exportando os dados da tabela para o Cloud Storage e carregando-os em uma tabela nova com uma definição de esquema que tenha o nome correto da coluna. Você também pode usar o job de carregamento para substituir a tabela atual.
Vantagens
- Você não é cobrado pelo job de exportação nem pelo job de carregamento. Atualmente, os jobs de carregamento e de exportação do BigQuery são gratuitos.
- Se você usar o job de carregamento para substituir a tabela original, terá custos de armazenamento para uma tabela em vez de duas, mas perderá os dados originais.
Desvantagens
- Se você carregar os dados em uma tabela nova, terá custos de armazenamento para a tabela original e para a tabela nova (a menos que exclua a antiga).
- Você será cobrado por armazenar os dados exportados no Cloud Storage.
Alterar o tipo de dados de uma coluna
A alteração do tipo de dados de uma coluna não é compatível com o console do Google Cloud, com a ferramenta de linha de comando bq
ou com a API. Se você tentar atualizar uma tabela usando um esquema que especifique um novo tipo de dado para uma coluna, isso resultará no seguinte erro: BigQuery error in update operation: Provided
Schema does not match Table project_id:dataset.table.
.
Há duas maneiras de alterar manualmente o tipo de dados de uma coluna:
- Com uma consulta SQL: escolha esta opção se estiver mais preocupado com a simplicidade e a facilidade de uso, e não com os custos.
- Com a recriação da tabela: escolha esta opção se você estiver mais preocupado com os custos, e não com a simplicidade e a facilidade de uso.
Opção 1: usar consultas
Use uma consulta SQL para selecionar todos os dados da tabela e aplicar a função cast à coluna relevante e fazendo a conversão para um tipo de dados diferente. É possível usar os resultados da consulta para substituir a tabela ou para criar uma nova tabela de destino.
Vantagens
- Usar uma consulta para gravar os dados em uma nova tabela de destino preserva os dados originais.
- Se você usar o job de consulta para substituir a tabela original, terá custos de armazenamento para uma tabela em vez de duas, mas perderá os dados originais.
Desvantagens
- Alterar o tipo de dados de uma coluna usando uma consulta exige a verificação da tabela inteira. É possível que as cobranças da consulta sejam elevadas se a tabela for muito grande.
- Se você gravar os resultados da consulta em uma nova tabela de destino, terá custos de armazenamento tanto para a tabela antiga como para a nova (a menos que você exclua a antiga).
CAST
exemplo
No exemplo a seguir, você verá uma consulta SQL padrão 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 atual. A tabela substituída armazena column_one
como um tipo de dados STRING
.
Quando a função CAST
é usada, pode ocorrer falha na consulta se o BigQuery não conseguir executar a conversão. Para detalhes sobre regras de uso de cast no SQL padrão, consulte como usar a função cast na documentação de referência de funções e operadores.
Console
No console do Google Cloud, clique em Escrever nova consulta.
No Editor de consultas, digite a seguinte consulta para selecionar todos os dados de
column_two
ecolumn_three
emmydataset.mytable
e para convertercolumn_one
deDATE
paraSTRING
. Na consulta, um alias é usado para aplicar a função cast acolumn_one
com o mesmo nome.mydataset.mytable
está no projeto padrão.SELECT column_two, column_three, CAST(column_one AS STRING) AS column_one FROM mydataset.mytable
Clique em Mais e selecione Configurações de consulta.
Na seção Destino, marque Definir uma tabela de destino para os resultados da consulta.
Nos campos a seguir:
Em Nome do projeto, deixe o valor definido como o projeto padrão. Este é o projeto que contém
mydataset.mytable
.Em Nome do conjunto de dados, escolha
mydataset
.No campo Nome da tabela, insira
mytable
.Clique em OK.
Na seção Preferência de gravação da tabela de destino, em Preferência de gravação, selecione Substituir tabela. Isso substitui
mytable
usando os resultados da consulta.Opcional: em Local de processamento, clique em Seleção automática e escolha o local dos seus dados.
Clique em Salvar para atualizar as configurações e, no Editor de consultas, clique em Executar. Quando o job de consulta for concluído, o tipo de dados de
column_one
seráSTRING
.
bq
Insira o seguinte comando bq query
para selecionar todos os dados de column_two
e column_three
em mydataset.mytable
e para converter column_one
de DATE
para STRING
. Na consulta, um alias é usado para aplicar a função cast a column_one
com o mesmo nome. mydataset.mytable
está no projeto padrão.
Os resultados da consulta são gravados em mydataset.mytable
usando a sinalização --destination_table
, e a sinalização --replace
é usada para substituir mytable
. Especifique a sinalização use_legacy_sql=false
para usar a sintaxe SQL padrão.
Opcional: forneça a sinalização --location
e defina o valor do
local.
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 para converter column_one
de DATE
para STRING
, chame o método jobs.insert
e configure um job query
. Opcional: especifique seu local na property location
da seção jobReference
.
A consulta SQL usada no job de consulta seria: SELECT column_two,
column_three, CAST(column_one AS STRING) AS column_one FROM
mydataset.mytable
. Na consulta, um alias é usado para aplicar a função cast a column_one
com o mesmo nome.
Para substituir mytable
pelos resultados da consulta, inclua mydataset.mytable
na property configuration.query.destinationTable
e especifique WRITE_TRUNCATE
na property configuration.query.writeDisposition
.
Opção 2: exportar e carregar dados em uma nova tabela
É possível alterar o tipo de dados de uma coluna exportando os dados da tabela para o Cloud Storage e carregando-os em uma nova tabela com uma definição de esquema que especifique o tipo de dados correto para a coluna. Você também pode usar o job de carregamento para substituir a tabela atual.
Vantagens
- Você não é cobrado pelo job de exportação nem pelo job de carregamento. Atualmente, os jobs de carregamento e de exportação do BigQuery são gratuitos.
- Se você usar o job de carregamento para substituir a tabela original, terá custos de armazenamento para uma tabela em vez de duas, mas perderá os dados originais.
Desvantagens
- Se você carregar os dados em uma tabela nova, terá custos de armazenamento para a tabela original e para a tabela nova (a menos que exclua a antiga).
- Você será cobrado por armazenar os dados exportados no Cloud Storage.
Alterar modo de coluna
Atualmente, a única modificação compatível com o modo de uma coluna é alterá-la de REQUIRED
para NULLABLE
. A alteração do modo de uma coluna de REQUIRED
para NULLABLE
também é chamada de relaxamento de coluna. Para informações sobre como relaxar colunas REQUIRED
para NULLABLE
, consulte Como relaxar o modo de uma coluna.
Se você tentar aplicar uma alteração não aceita a um modo de coluna, um erro como este será retornado. Neste exemplo, foi feita uma tentativa de mudar o modo de uma coluna de NULLABLE
para REPEATED
: BigQuery error in update
operation: Provided Schema does not match Table
project_id:dataset.table. Field
field has changed mode from NULLABLE to REPEATED.
.
Exportar e carregar dados em uma nova tabela
É possível alterar manualmente o modo de uma coluna exportando os dados da tabela para o Cloud Storage e, em seguida, carregando-os em uma tabela nova com uma definição de esquema que especifique o modo correto para a coluna. Você também pode usar o job de carregamento para substituir a tabela atual.
Vantagens
- Você não é cobrado pelo job de exportação nem pelo job de carregamento. Atualmente, os jobs de carregamento e de exportação do BigQuery são gratuitos.
- Se você usar o job de carregamento para substituir a tabela original, terá custos de armazenamento para uma tabela em vez de duas, mas perderá os dados originais.
Desvantagens
- Se você carregar os dados em uma tabela nova, terá custos de armazenamento para a tabela original e para a tabela nova (a menos que exclua a antiga).
- Você será cobrado por armazenar os dados exportados no Cloud Storage.
Excluir colunas a partir do esquema da tabela
A exclusão de uma coluna de um esquema de tabela atual não é compatível com o console do Google Cloud, com a ferramenta de linha de comando bq
ou com a API. Se você tentar atualizar uma tabela usando um esquema que remova uma coluna, verá o seguinte erro: BigQuery error in update operation: Provided Schema does not
match Table project_id:dataset.table.
.
Há duas maneiras de excluir colunas manualmente:
- Com uma consulta SQL: escolha esta opção se estiver mais preocupado com a simplicidade e a facilidade de uso, e não com os custos.
- Com a recriação da tabela: escolha esta opção se você estiver mais preocupado com os custos, e não com a simplicidade e a facilidade de uso.
Opção 1: usar consultas
Há duas instruções SQL que podem ser usadas para excluir uma coluna:
SELECT * EXCEPT
ALTER TABLE DROP COLUMN
A seção a seguir mostra como usar uma consulta SELECT * EXCEPT
que exclui a coluna (ou as colunas) que você quer
remover e usa o resultado da consulta para substituir a tabela ou
criar uma nova tabela de destino.
Para usar a instrução ALTER TABLE DROP COLUMN
, consulte os exemplos na página
Linguagem de definição de
dados.
Vantagens
- Usar uma consulta para gravar os dados em uma nova tabela de destino preserva os dados originais.
- Se você usar o job de consulta para substituir a tabela original, terá custos de armazenamento para uma tabela em vez de duas, mas perderá os dados originais.
Desvantagens
- A exclusão de uma coluna usando uma consulta exige que você examine os dados em todas as colunas, exceto a que está removendo. As cobranças de consulta podem ser significativas se a tabela for muito grande.
- Se você gravar os resultados da consulta em uma nova tabela de destino, terá custos de armazenamento tanto para a tabela antiga como para a nova (a menos que você exclua a antiga).
SELECT * EXCEPT
exemplo
No exemplo a seguir, vemos uma consulta SQL padrão que seleciona todos os dados de mydataset.mytable
, exceto column_two
. O resultado da consulta é usado para substituir a tabela atual.
Console
No console do Google Cloud, clique em Escrever nova consulta.
No Editor de consultas, insira a seguinte consulta para selecionar todos os dados de
mydataset.mytable
, excetocolumn_two
.mydataset.mytable
está no projeto padrão.SELECT * EXCEPT(column_two) FROM mydataset.mytable
Clique em Mais e selecione Configurações de consulta.
Na seção Destino, marque Definir uma tabela de destino para os resultados da consulta.
Nos campos a seguir:
Em Nome do projeto, deixe o valor definido como o projeto padrão. Este é o projeto que contém
mydataset.mytable
.Em Nome do conjunto de dados, escolha
mydataset
.No campo Nome da tabela, insira
mytable
.Clique em OK.
Na seção Preferência de gravação da tabela de destino, em Preferência de gravação, selecione Substituir tabela. Isso substitui
mytable
usando os resultados da consulta.Opcional: em Local de processamento, clique em Seleção automática e escolha o local dos seus dados.
Clique em Salvar para atualizar as configurações e, no Editor de consultas, clique em Executar. Quando o job de consulta for concluído, a tabela incluirá todas as colunas, exceto
column_two
.
bq
Insira o seguinte comando bq query
para selecionar todos os dados de mydataset.mytable
, exceto column_two
. mydataset.mytable
está no projeto padrão. Os resultados da consulta são gravados em mydataset.mytable
usando a sinalização --destination_table
, e a sinalização --replace
é usada para substituir mytable
. Especifique a sinalização use_legacy_sql=false
para usar a sintaxe SQL padrão.
Opcional: forneça a sinalização --location
e defina o valor do
local.
bq query \
--destination_table mydataset.mytable \
--replace \
--use_legacy_sql=false \
'SELECT
* EXCEPT(column_two)
FROM
mydataset.mytable'
API
Para selecionar todos os dados de mydataset.mytable
, exceto column_two
, chame o método jobs.insert
e configure um job query
. Opcional: especifique seu local na property location
da seção jobReference
.
A consulta SQL usada no job de consulta seria: SELECT * EXCEPT(column_two)
FROM mydataset.mytable
.
Para substituir mytable
pelos resultados da consulta, inclua mydataset.mytable
na property configuration.query.destinationTable
e especifique WRITE_TRUNCATE
na property configuration.query.writeDisposition
.
Opção 2: exportar e carregar dados em uma nova tabela
Também é possível remover uma coluna exportando os dados da tabela para o Cloud Storage, excluindo os dados correspondentes das colunas que você quer remover e, em seguida, carregando-os em uma tabela nova com uma definição de esquema que não inclua as colunas removidas. Você também pode usar o job de carregamento para substituir a tabela atual.
Vantagens
- Você não é cobrado pelo job de exportação nem pelo job de carregamento. Atualmente, os jobs de carregamento e de exportação do BigQuery são gratuitos.
- Se você usar o job de carregamento para substituir a tabela original, terá custos de armazenamento para uma tabela em vez de duas, mas perderá os dados originais.
Desvantagens
- Se você carregar os dados em uma tabela nova, terá custos de armazenamento para a tabela original e para a tabela nova (a menos que exclua a antiga).
- Você será cobrado por armazenar os dados exportados no Cloud Storage.
Segurança de tabelas
Para controlar o acesso a tabelas no BigQuery, consulte Introdução aos controles de acesso a tabelas.