Tabelas do BigQuery para Apache Iceberg
Para receber suporte durante a prévia, envie um e-mail para bigquery-tables-for-apache-iceberg-help@google.com.
As tabelas do BigQuery para Apache Iceberg (doravante, tabelas do Iceberg) fornecem a base para criar lakehouses de formato aberto no Google Cloud. As tabelas Iceberg oferecem a mesma experiência totalmente gerenciada das tabelas do BigQuery, mas armazenam dados em buckets de armazenamento do cliente usando o Parquet para serem interoperáveis com os formatos de tabelas abertas do Iceberg.
As tabelas do BigQuery para Apache Iceberg são diferentes das tabela externas do BigLake para Apache Iceberg porque apenas as tabelas do BigQuery para Apache Iceberg podem ser modificadas diretamente no BigQuery. As tabelas externas do BigLake para o Apache Iceberg são tabelas somente leitura geradas em outro mecanismo de consulta, como o Apache Spark, e só podem ser consultadas usando o BigQuery.
As tabelas Iceberg são compatíveis com os seguintes recursos:
- Mutações de tabela usando a linguagem de manipulação de dados (DML) do GoogleSQL.
- Streaming unificado de lote e de alta capacidade de processamento usando a API StorageWrite com os conectores do BigLake, como Spark, Dataflow e outros mecanismos.
- Evolução do esquema, que permite adicionar, soltar e renomear colunas de acordo com suas necessidades. Esse recurso também permite mudar o tipo de dados de uma coluna e o modo de coluna. Para mais informações, consulte as regras de conversão de tipo.
- Otimização automática de armazenamento, incluindo dimensionamento de arquivos adaptável, clustering automático, coleta de lixo e otimização de metadados.
- Segurança no nível da coluna e mascaramento de dados.
Arquitetura
As tabelas Iceberg trazem a conveniência do gerenciamento de recursos do BigQuery para tabelas que residem nos seus próprios buckets da nuvem. Com as tabelas Iceberg, é possível usar o BigQuery nelas sem mover os dados dos buckets que você controla.
O diagrama a seguir mostra a arquitetura de tabelas gerenciadas em um nível geral:
Esse gerenciamento de tabelas tem as seguintes implicações no seu bucket:
- O BigQuery cria novos arquivos de dados no bucket em resposta a solicitações de gravação e otimizações de armazenamento em segundo plano, como instruções DML e streaming.
- Quando você exclui uma tabela gerenciada no BigQuery, ele não exclui os arquivos de dados associados. Confirme a exclusão excluindo manualmente os arquivos e os metadados de tabela exportados do bucket.
- As tabelas Iceberg não incorrem em custos de armazenamento do BigQuery. Veja mais informações em Faturamento.
A criação de uma tabela Iceberg é semelhante à criação de tabelas do BigQuery. Como ele armazena dados em formatos abertos no Cloud Storage, ele tem mais opções para:
- Especifique a
conexão de recursos do Cloud
com
WITH CONNECTION
para configurar as credenciais de conexão do BigLake para acessar o Cloud Storage. - Especificar o formato do arquivo de armazenamento de dados com
file_format
. OPARQUET
tem suporte na visualização. - Especificar o formato da tabela de metadados de código aberto com
table_format
. OICEBERG
tem suporte na visualização.
Práticas recomendadas
Mudar ou adicionar arquivos diretamente ao bucket fora do BigQuery pode causar perda de dados ou erros irreversíveis. A tabela a seguir descreve os possíveis cenários:
Operação | Consequências | Prevenção |
---|---|---|
Adicione novos arquivos ao bucket fora do BigQuery. | Perda de dados:novos arquivos ou objetos adicionados fora do BigQuery não são rastreados por ele. Os arquivos não rastreados são excluídos por processos de coleta de lixo em segundo plano. | Adicione dados exclusivamente pelo BigQuery. Isso permite que o BigQuery rastreie os arquivos e evite que eles sejam coletados. Para evitar adições acidentais e perda de dados, também recomendamos restringir as permissões de gravação de ferramentas externas em buckets que contêm tabelas Iceberg. |
Crie uma nova tabela do Iceberg em um prefixo não vazio. | Perda de dados:os dados existentes não são rastreados pelo BigQuery. Portanto, esses arquivos são considerados não rastreados e excluídos por processos de coleta de lixo em segundo plano. | Crie apenas novas tabelas Iceberg em prefixos vazios. |
Modifique ou substitua os arquivos de dados da tabela do Iceberg. | Perda de dados:em caso de modificação ou substituição externa,
a tabela falha em uma verificação de consistência e fica ilegível. As consultas
na tabela falham. Não há como recuperar o acesso por conta própria. Entre em contato com o suporte para receber ajuda com a recuperação de dados. |
Modifique os dados exclusivamente pelo BigQuery. Isso permite que o BigQuery rastreie os arquivos e evite que eles sejam coletados. Para evitar adições acidentais e perda de dados, também recomendamos restringir as permissões de gravação de ferramentas externas em buckets que contêm tabelas Iceberg. |
Crie duas tabelas do BigQuery para o Apache Iceberg com os mesmos URIs ou com URIs sobrepostos. | Perda de dados:o BigQuery não conecta instâncias de URI idênticas de tabelas Iceberg. Os processos de coleta de lixo em segundo plano para cada tabela vão considerar os arquivos da tabela oposta como não rastreados e excluí-los, causando perda de dados. | Use URIs exclusivos para cada tabela do Iceberg. |
Consideração de local
É possível melhorar a performance usando buckets de região única ou birregional do Cloud Storage em vez de buckets multirregionais.
Faturamento
Os recursos a seguir são cobrados usando os preços publicados:
- Preços do Cloud Storage para todos os dados armazenados em buckets do Cloud Storage, processamento de dados feito pelo Cloud Storage e uso da rede para a quantidade de dados lidos do bucket.
- Preços de computação do BigQuery
para consultas, DML e otimização de armazenamento em segundo plano (incluindo
agrupamento, coalescência e coleta de lixo).
- As cobranças que usam reservas (slots) seguem os preços atuais.
- As cobranças que usam as unidades de manutenção de estoque (SKUs) on demand seguem os preços on demand atuais. Para mais informações, consulte Custos do BigLake.
- A computação de carga em lote e de extração é cobrada usando SKUs on demand ou reservas (slots).
- Preço da API Storage Read para ler do Spark pela API Read.
- Preços da API Storage Write para streaming.
Fluxos de trabalho de tabelas Iceberg
As seções a seguir descrevem como criar, carregar, gerenciar e consultar tabelas gerenciadas.
Antes de começar
Antes de criar e usar tabelas do Iceberg, verifique se você configurou uma conexão de recursos do Cloud em um bucket de armazenamento. Sua conexão precisa de permissões de gravação no bucket de armazenamento, conforme especificado na seção Papéis obrigatórios a seguir.
Funções exigidas
Para receber as permissões necessárias para permitir que o BigQuery gerencie tabelas no seu projeto, peça ao administrador para conceder a você os seguintes papéis do IAM:
-
Para criar tabelas Iceberg:
-
Proprietário de dados do BigQuery (
roles/bigquery.dataOwner
) no seu projeto -
Administrador de conexão do BigQuery (
roles/bigquery.connectionAdmin
) no projeto
-
Proprietário de dados do BigQuery (
-
Para consultar tabelas Iceberg:
-
Leitor de dados do BigQuery (
roles/bigquery.dataViewer
) no seu projeto -
Usuário do BigQuery (
roles/bigquery.user
) no seu projeto
-
Leitor de dados do BigQuery (
-
Para que a conta de serviço de conexão leia e grave dados no Cloud Storage:
-
Administrador de objetos do Storage (
roles/storage.objectAdmin
) no bucket -
Leitor de bucket legado do Storage (
roles/storage.legacyBucketReader
) no bucket
-
Administrador de objetos do Storage (
Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.
Esses papéis predefinidos contêm as permissões necessárias para permitir que o BigQuery gerencie tabelas no seu projeto. Para conferir as permissões exatas necessárias, expanda a seção Permissões necessárias:
Permissões necessárias
As seguintes permissões são necessárias para permitir que o BigQuery gerencie tabelas no seu projeto:
-
bigquery.connections.delegate
no seu projeto -
bigquery.jobs.create
no seu projeto -
bigquery.readsessions.create
no seu projeto -
bigquery.tables.create
no seu projeto -
bigquery.tables.get
no seu projeto -
bigquery.tables.getData
no seu projeto -
storage.buckets.get
no seu projeto -
storage.objects.create
no seu projeto -
storage.objects.delete
no seu projeto -
storage.objects.get
no seu projeto -
storage.objects.list
no seu projeto
Essas permissões também podem ser concedidas com funções personalizadas ou outros papéis predefinidos.
Criar tabelas Iceberg
Para criar uma tabela Iceberg, selecione um dos seguintes métodos:
SQL
CREATE TABLE [PROJECT_NAME.]DATASET_NAME.TABLE_NAME ( COLUMN DATA_TYPE[, ...] ) CLUSTER BY CLUSTER_COLUMN_LIST WITH CONNECTION CONNECTION_NAME OPTIONS ( file_format = 'PARQUET', table_format = 'ICEBERG', storage_uri = 'STORAGE_URI');
Substitua:
- PROJECT_NAME: o projeto que contém o conjunto de dados. Se não for definido, o comando vai assumir o projeto padrão.
- DATASET_NAME: um conjunto de dados existente.
- TABLE_NAME: o nome da tabela que você está criando;
- DATA_TYPE: o tipo de dados das informações contidas na coluna.
- CLUSTER_COLUMN_LIST: uma lista separada por vírgulas que contém até quatro colunas. Elas precisam ser de nível superior e não repetidas.
- CONNECTION_NAME: o nome da conexão. Por exemplo,
myproject.us.myconnection
. - STORAGE_URI: um URI do Cloud Storage totalmente qualificado.
Por exemplo,
gs://mybucket/table
.
bq
bq --project_id=PROJECT_NAME mk \ --file_format=PARQUET \ --table_format=ICEBERG \ --connection_id=CONNECTION_NAME \ --storage_uri=STORAGE_URI \ --schema=COLUMN_NAME:DATA_TYPE[, ...] \ --clustering_fields=CLUSTER_COLUMN_LIST \ MANAGED_TABLE_NAME
Substitua:
- PROJECT_NAME: o projeto que contém o conjunto de dados. Se não for definido, o comando vai assumir o projeto padrão.
- CONNECTION_NAME: o nome da conexão. Por exemplo,
myproject.us.myconnection
. - STORAGE_URI: um URI do Cloud Storage totalmente qualificado.
Por exemplo,
gs://mybucket/table
. - COLUMN_NAME: o nome da coluna.
- DATA_TYPE: o tipo de dados das informações contidas na coluna.
- CLUSTER_COLUMN_LIST: uma lista separada por vírgulas que contém até quatro colunas. Elas precisam ser de nível superior e não repetidas.
- MANAGED_TABLE_NAME: o nome da tabela que você está criando.
API
Chame o método
tables.insert
com um recurso de tabela definido, semelhante a
este:
{ "tableReference": { "tableId": "TABLE_NAME" }, "biglakeConfiguration": { "connectionId": "CONNECTION_NAME", "fileFormat": "PARQUET", "tableFormat": "ICEBERG", "storageUri": "STORAGE_URI" }, "schema": { "fields": [ { "name": "COLUMN_NAME", "type": "DATA_TYPE" } [, ...] ] } }
Substitua:
- TABLE_NAME: o nome da tabela que você está criando.
- CONNECTION_NAME: o nome da conexão. Por exemplo,
myproject.us.myconnection
. - STORAGE_URI: um URI do Cloud Storage totalmente qualificado.
Os caracteres curinga também são compatíveis. Por exemplo,
gs://mybucket/table
. - COLUMN_NAME: o nome da coluna.
- DATA_TYPE: o tipo de dados das informações contidas na coluna.
Importar dados para a tabela Iceberg
As seções a seguir descrevem como importar dados de vários formatos de tabela para tabelas Iceberg.
Carga rápida de arquivos Parquet
A opção copy_files_only
permite carregar dados mais rapidamente copiando seus arquivos
Parquet atuais, em vez de ler o conteúdo e gravá-lo como novos
arquivos. O carregamento rápido usa menos capacidade de computação em comparação com um carregamento de arquivo normal.
Os arquivos Parquet precisam ser compatíveis com a
especificação do Apache Iceberg
e ter estatísticas de coluna completas. O carregamento rápido não detecta valores inválidos
(como carimbos de data/hora fora do intervalo) em arquivos porque eles
não são lidos e reprocessados. Para mais informações sobre como carregar arquivos Parquet, consulte
Como carregar dados Parquet em uma nova tabela.
Para carregar rapidamente arquivos Parquet simples em uma tabela
Iceberg, use o
comando bq load
:
bq load \ --copy_files_only \ --source_format=PARQUET \ DATASET_NAME.TABLE_NAME \ PATH_TO_SOURCE
Substitua:
- DATASET_NAME: o conjunto de dados que contém a tabela "Iceberg".
- TABLE_NAME: o nome da tabela do Iceberg em que você está carregando dados.
- PATH_TO_SOURCE: um URI do Cloud Storage
totalmente qualificado ou uma lista de URIs separada por vírgulas.
Os caracteres curinga também são compatíveis. Por exemplo,
gs://mybucket/mydata*.parquet
.
Carregar dados padrão de arquivos simples
As tabelas Iceberg usam jobs de carga do BigQuery para carregar arquivos externos nelas. Se você tiver uma tabela do Iceberg, siga o guia da CLI bq load
ou o guia SQL LOAD
para carregar dados externos. Depois de carregar os dados, novos arquivos Parquet são gravados
na pasta STORAGE_URI/data
.
Se as instruções anteriores forem usadas sem uma tabela do Iceberg, uma tabela do BigQuery será criada.
Confira a seguir exemplos específicos de ferramentas de carregamentos em lote em tabelas gerenciadas:
SQL
LOAD DATA INTO MANAGED_TABLE_NAME FROM FILES ( uris=['STORAGE_URI'], format='FILE_FORMAT');
Substitua:
- MANAGED_TABLE_NAME: o nome de uma tabela Iceberg
- STORAGE_URI: um URI do Cloud Storage
totalmente qualificado ou uma lista de URIs separada por vírgulas.
Os caracteres curinga também são compatíveis. Por exemplo,
gs://mybucket/table
. - FILE_FORMAT: o formato da tabela de origem. Para saber quais formatos são aceitos,
consulte a linha
format
deload_option_list
.
bq
bq load \ --source_format=FILE_FORMAT \ MANAGED_TABLE \ STORAGE_URI
Substitua:
- FILE_FORMAT: o formato da tabela de origem. Para saber quais formatos são aceitos,
consulte a linha
format
deload_option_list
. - MANAGED_TABLE_NAME: o nome de uma tabela Iceberg
- STORAGE_URI: um URI do Cloud Storage
totalmente qualificado ou uma lista de URIs separada por vírgulas.
Os caracteres curinga também são compatíveis. Por exemplo,
gs://mybucket/table
.
Carga padrão de arquivos particionados do Hive
É possível carregar arquivos particionados do Hive em tabelas do Iceberg usando jobs de carregamento padrão do BigQuery. Para mais informações, consulte Como carregar dados particionados externamente.
Carregar dados de streaming do Pub/Sub
É possível carregar dados de streaming em tabelas Iceberg usando uma assinatura do Pub/Sub no BigQuery.
Exportar dados das tabelas Iceberg
As seções a seguir descrevem como exportar dados de tabelas Iceberg para vários formatos de tabela.
Exportar dados para formatos simples
Para exportar uma tabela Iceberg para um formato plano, use a
instrução EXPORT DATA
e selecione um formato de destino. Para mais informações, consulte
Como exportar dados.
Ler tabelas Iceberg com metadados do Iceberg
Para ler dados das tabelas Iceberg no formato Iceberg, siga estas etapas:
Exporte os metadados para o formato Iceberg com a instrução SQL
EXPORT TABLE METADATA
.Configure e leia dados de tabelas no Apache Spark com o
HadoopCatalog
.O exemplo a seguir configura seu ambiente para usar o Spark SQL com o Apache Iceberg e, em seguida, executa uma consulta para buscar dados de uma tabela Iceberg especificada.
spark-sql \ --packages org.apache.iceberg:iceberg-spark-runtime-ICEBERG_VERSION_NUMBER \ --conf spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog \ --conf spark.sql.catalog.CATALOG_NAME.type=hadoop \ --conf spark.sql.catalog.CATALOG_NAME.warehouse='BUCKET_PATH' \ # Queries the table spark-sql> SELECT * FROM CATALOG_NAME.FOLDER_NAME;
Substitua:
- ICEBERG_VERSION_NUMBER: a versão atual do ambiente de execução do Apache Spark Iceberg. Faça o download da versão mais recente em Lançamentos do Spark.
- CATALOG_NAME: o catálogo para referenciar a tabela Iceberg.
- BUCKET_PATH: o caminho para o bucket que contém os
arquivos de tabela. Por exemplo,
gs://mybucket/
. - FOLDER_NAME: a pasta que contém os arquivos de tabela.
Por exemplo,
myfolder
.
Modificar tabelas do Iceberg
Para modificar uma tabela do Iceberg, siga as etapas em Como modificar esquemas de tabelas.
Preços
O preço da tabela Iceberg consiste em três componentes separados:
Armazenamento
A tabela Iceberg armazena todos os dados no Cloud Storage. Você vai receber cobrança por todos os dados armazenados, incluindo os dados históricos da tabela. As cobranças de processamento de dados e de transferência do Cloud Storage também podem ser aplicadas. Não há taxas de armazenamento específicas do BigQuery. Para mais informações, consulte Preços do Cloud Storage.
Otimização de armazenamento
As tabelas Iceberg exigem operações de otimização de armazenamento, como a união de arquivos
e a reclassificação.
Essas operações de otimização usam
slots de pagamento conforme o uso da edição Enterprise
e não usam reservas BACKGROUND
atuais.
As operações de exportação de dados que ocorrem durante o streaming pela API Storage Write do BigQuery estão incluídas nos preços da API Storage Write e não são cobradas como manutenção em segundo plano. Para mais informações, consulte Preços de ingestão de dados do BigQuery.
Consultas e jobs
Assim como nas tabelas do BigQuery, você vai receber cobranças por consultas e bytes lidos (por TiB) se estiver usando o preço on demand do BigQuery ou o consumo de slots (por hora de slot) se estiver usando o preço de computação de capacidade do BigQuery.
Os preços do BigQuery também se aplicam à API BigQuery Storage Read e à API BigQuery Storage Write.
As operações de carga e exportação (como EXPORT METADATA
) usam
slots de pagamento por uso da edição Enterprise.
Isso é diferente das tabelas do BigQuery, que não são cobradas por
essas operações. Se as reservas PIPELINE
com slots Enterprise ou
Enterprise Plus estiverem disponíveis, as operações de carga e exportação
vão usar preferencialmente esses slots de reserva.
Limitações
As tabelas Iceberg têm as seguintes limitações:
- As tabelas Iceberg não oferecem suporte a
operações de renomeação ou
instruções
ALTER TABLE RENAME TO
. - As tabelas Iceberg não oferecem suporte a
cópias de tabela ou
instruções
CREATE TABLE COPY
. - As tabelas Iceberg não oferecem suporte a
clones de tabela ou
instruções
CREATE TABLE CLONE
. - As tabelas Iceberg não oferecem suporte a
snapshots de tabela ou
instruções
CREATE SNAPSHOT TABLE
. - As tabelas Iceberg não oferecem suporte ao seguinte esquema de tabela:
- Esquema vazio
- Esquema com tipos de dados
INTERVAL
,JSON
,RANGE
ouGEOGRAPHY
. - Esquema com colações de campo.
- Esquema com expressões de valor padrão.
EXPORT METADATA
não é compatível com tabelas que contêm tipos de dadosBIGNUMERIC
ouNUMERIC
com precisão maior que 38 casas.- As tabelas Iceberg não oferecem suporte aos seguintes casos de evolução
do esquema:
- Coerções de tipo
NUMERIC
aFLOAT
- Coerções de tipo
INT
aFLOAT
- Adicionar novos campos aninhados a colunas
RECORD
usando instruções DDL SQL
- Coerções de tipo
- As tabelas Iceberg mostram um tamanho de armazenamento de 0 bytes quando consultadas pelo console ou pelas APIs.
- As tabelas Iceberg não oferecem suporte a visualizações materializadas.
- As tabelas Iceberg não são compatíveis com transações de várias instruções.
- As tabelas Iceberg não oferecem suporte a atualizações de captura de dados alterados (CDC).
- Ao transmitir dados para tabelas do Iceberg usando a API BigQuery Storage Write, primeiro é necessário desativar o cache de consulta.
- As tabelas Iceberg não oferecem suporte à recuperação de desastres gerenciada.
- As tabelas Iceberg não oferecem suporte a particionamento. Considere agrupar como uma alternativa.
- As tabelas Iceberg não oferecem suporte à segurança no nível da linha.
- As tabelas Iceberg não oferecem suporte a viagem no tempo.
- As tabelas Iceberg não oferecem suporte a janelas de fail-safe.
- As tabelas Iceberg não oferecem suporte a jobs de extração.
- A visualização
INFORMATION_SCHEMA.TABLE_STORAGE
não inclui tabelas Iceberg. - As tabelas Iceberg não são aceitas como destinos de resultados de consulta.
- O
CREATE OR REPLACE
não oferece suporte à substituição de tabelas padrão por tabelas Iceberg ou vice-versa. - O carregamento em lote e as instruções
LOAD DATA
são compatíveis apenas com a adição de dados a tabelas do Iceberg. - O carregamento em lote e as instruções
LOAD DATA
não são compatíveis com atualizações de esquema. - O
TRUNCATE TABLE
não oferece suporte a tabelas Iceberg. Existem duas alternativas:CREATE OR REPLACE TABLE
, usando as mesmas opções de criação de tabelas.DELETE FROM
tabelaWHERE
verdadeiro
- A
função com valor de tabela (TVF)
APPENDS
não oferece suporte a tabelas Iceberg. - As exportações do Iceberg no Apache Spark não contêm dados transmitidos recentemente no armazenamento otimizado para gravação.
- O carregamento rápido não é compatível com arquivos com nomes de colunas flexíveis.