Criar tabelas externas somente leitura do Apache Iceberg
As tabelas externas somente leitura do Apache Iceberg permitem acessar tabelas do Apache Iceberg com um controle de acesso mais refinado em um formato somente leitura. Essa capacidade é diferente das tabelas do BigLake para Apache Iceberg no BigQuery, que permitem criar tabelas do Iceberg no BigQuery em um formato gravável.
O Iceberg é um formato de tabela de código aberto compatível com tabelas de dados de escala de petabytes. A especificação aberta do Iceberg permite executar vários mecanismos de consulta em uma única cópia dos dados armazenados em um armazenamento de objetos. As tabelas externas somente leitura do Apache Iceberg (doravante chamadas de tabelas somente leitura do Iceberg) são compatíveis com a versão 2 da especificação do Iceberg, incluindo a mesclagem na leitura.
Como administrador do BigQuery, é possível aplicar o controle de acesso no nível da linha e da coluna, incluindo o mascaramento de dados em tabelas. Para informações sobre como configurar o controle de acesso no nível da tabela, consulte Configurar políticas de controle de acesso. As políticas de acesso à tabela também são aplicadas quando você usa a API BigQuery Storage como fonte de dados da tabela no Dataproc e no Spark sem servidor.
É possível criar tabelas Iceberg somente leitura das seguintes maneiras:
Com o metastore do BigLake (recomendado para Google Cloud). A metastore do BigLake é baseada no catálogo do BigQuery e se integra diretamente a ele. As tabelas no metastore do BigLake podem ser alteradas por vários mecanismos de código aberto, e as mesmas tabelas podem ser consultadas no BigQuery. A metastore do BigLake também oferece suporte à integração direta com o Apache Spark.
Com o AWS Glue Data Catalog (recomendado para a AWS). O AWS Glue é o método recomendado para o AWS porque é um repositório de metadados centralizado em que você define a estrutura e o local dos dados armazenados em vários serviços da AWS e fornece recursos como descoberta automática de esquemas e integração com ferramentas de análise da AWS.
Com arquivos de metadados JSON do Iceberg (recomendado para o Azure). Se você usa um arquivo de metadados JSON do Iceberg, atualize manualmente o arquivo de metadados mais recente sempre que houver uma atualização na tabela. É possível usar um procedimento armazenado do BigQuery para o Apache Spark para criar tabelas somente leitura do Iceberg que fazem referência a um arquivo de metadados do Iceberg.
Para acessar uma lista completa de limitações, consulte Limitações.
Antes de começar
Enable the BigQuery Connection and BigQuery Reservation APIs.
Se você usa um procedimento armazenado para o Spark no BigQuery para criar tabelas somente leitura do Iceberg, siga estas etapas:
Para armazenar os metadados e arquivos de dados da tabela somente leitura do Iceberg no Cloud Storage, crie um bucket do Cloud Storage. Você precisa se conectar ao bucket do Cloud Storage para acessar arquivos de metadados. Para fazer isso, siga estas etapas:
Funções exigidas
Para receber as permissões necessárias para criar uma tabela somente leitura do Iceberg, peça ao administrador para conceder a você os seguintes papéis do IAM no projeto:
-
Administrador do BigQuery (
roles/bigquery.admin
) -
Administrador de objetos do Storage (
roles/storage.objectAdmin
)
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 criar uma tabela somente leitura do Iceberg. 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 criar uma tabela somente leitura do Iceberg:
-
bigquery.tables.create
-
bigquery.connections.delegate
-
bigquery.jobs.create
Essas permissões também podem ser concedidas com funções personalizadas ou outros papéis predefinidos.
Criar tabelas com o metastore do BigLake
Recomendamos criar tabelas somente leitura do Iceberg com o metastore do BigLake. É possível usar o Apache Spark para criar essas tabelas. Uma maneira conveniente de fazer isso é usar os procedimentos armazenados do BigQuery. Para um exemplo, consulte Criar e executar um procedimento armazenado.
Criar tabelas com um arquivo de metadados
É possível criar tabelas somente leitura do Iceberg com um arquivo de metadados JSON. No entanto, esse não é o método recomendado porque você precisa atualizar manualmente o URI do arquivo de metadados JSON para manter a tabela somente leitura do Iceberg atualizada. Se o URI não for atualizado, as consultas no BigQuery poderão falhar ou fornecer resultados diferentes de outros mecanismos de consulta que usam diretamente um catálogo do Iceberg.
Os arquivos de metadados da tabela do Iceberg são criados no bucket do Cloud Storage que você especificou ao criar uma tabela do Iceberg usando o Spark.
Selecione uma das seguintes opções:
SQL
Use a instrução CREATE EXTERNAL TABLE
. O exemplo a seguir cria uma
tabela somente leitura do Iceberg chamada myexternal-table
:
CREATE EXTERNAL TABLE myexternal-table WITH CONNECTION `myproject.us.myconnection` OPTIONS ( format = 'ICEBERG', uris = ["gs://mybucket/mydata/mytable/metadata/iceberg.metadata.json"] )
Substitua o valor uris
pelo arquivo de metadados JSON mais recente para um snapshot de tabela específico.
É possível ativar o filtro de partição definindo a sinalização require_partition_filter
.
bq
Em um ambiente de linha de comando, use o comando bq mk --table
com o decorador @connection
para especificar a conexão a ser usada no final
do parâmetro --external_table_definition
.
Para ativar o filtro de partição exigido, use --require_partition_filter
.
bq mk
--table
--external_table_definition=TABLE_FORMAT=URI@projects/CONNECTION_PROJECT_ID/locations/CONNECTION_REGION/connections/CONNECTION_ID
PROJECT_ID:DATASET.EXTERNAL_TABLE
Substitua:
TABLE_FORMAT
: o formato da tabela que você quer criarNesse caso,
ICEBERG
.URI
: o arquivo de metadados JSON mais recente para um snapshot de tabela específica.Por exemplo,
gs://mybucket/mydata/mytable/metadata/iceberg.metadata.json
O URI também pode apontar para um local externo de nuvem. como Amazon S3 ou Azure Blob Storage.
- Exemplo para a AWS:
s3://mybucket/iceberg/metadata/1234.metadata.json
. - Exemplo do Azure:
azure://mystorageaccount.blob.core.windows.net/mycontainer/iceberg/metadata/1234.metadata.json
.
- Exemplo para a AWS:
CONNECTION_PROJECT_ID
: o projeto que contém a conexão para criar a tabela somente leitura do Iceberg. Por exemplo,myproject
CONNECTION_REGION
: a região que contém a conexão para criar a tabela somente leitura do Iceberg, por exemplo,us
.CONNECTION_ID
: o ID da conexão da tabela. Por exemplo,myconnection
.Quando você visualiza os detalhes da conexão no console do Google Cloud , o ID da conexão é o valor na última seção do ID da conexão totalmente qualificado, mostrado em ID da conexão, por exemplo,
projects/myproject/locations/connection_location/connections/myconnection
.DATASET
: o nome do conjunto de dados do BigQuery em que você quer criar uma tabelaPor exemplo,
mydataset
EXTERNAL_TABLE
: o nome da tabela que você quer criar.Por exemplo,
mytable
Atualizar metadados de tabela
Se você usar um arquivo de metadados JSON para criar uma tabela somente leitura do Iceberg, atualize a definição da tabela para os metadados mais recentes dela. Para atualizar o esquema ou o arquivo de metadados, selecione uma das seguintes opções:
bq
Crie um arquivo de definição da tabela:
bq mkdef --source_format=ICEBERG \ "URI" > TABLE_DEFINITION_FILE
Use o comando
bq update
com a sinalização--autodetect_schema
:bq update --autodetect_schema --external_table_definition=TABLE_DEFINITION_FILE PROJECT_ID:DATASET.TABLE
Substitua:
URI
: o URI do Cloud Storage com o arquivo de metadados JSON mais recentePor exemplo,
gs://mybucket/us/iceberg/mytable/metadata/1234.metadata.json
.TABLE_DEFINITION_FILE
: o nome do arquivo que contém o esquema da tabelaPROJECT_ID
: o ID do projeto que contém a tabela que você quer atualizarDATASET
: o conjunto de dados que contém a tabela que você quer atualizarTABLE
: a tabela que você quer atualizar
API
Use o método tables.patch
com a propriedade autodetect_schema
definida como true
:
PATCH https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT_ID/datasets/DATASET/tables/TABLE?autodetect_schema=true
Substitua:
PROJECT_ID
: o ID do projeto que contém a tabela que você quer atualizarDATASET
: o conjunto de dados que contém a tabela que você quer atualizarTABLE
: a tabela que você quer atualizar
No corpo da solicitação, especifique os valores atualizados dos seguintes campos:
{ "externalDataConfiguration": { "sourceFormat": "ICEBERG", "sourceUris": [ "URI" ] }, "schema": null }'
Substitua URI
pelo arquivo de metadados mais recente do Iceberg. Por exemplo, gs://mybucket/us/iceberg/mytable/metadata/1234.metadata.json
.
configurar políticas de controle de acesso
É possível controlar o acesso a tabelas somente leitura do Iceberg usando a segurança no nível da coluna, a segurança no nível da linha e o mascaramento de dados.
Consultar tabelas Iceberg somente leitura
Para mais informações, consulte Consultar dados do Iceberg.
Mapeamento de dados
O BigQuery converte tipos de dados do Iceberg em tipos de dados do BigQuery, conforme mostrado na tabela a seguir:
Tipo de dados do Iceberg | Tipo de dados BigQuery |
---|---|
boolean |
BOOL |
int |
INT64 |
long |
INT64 |
float |
FLOAT64 |
double |
FLOAT64 |
Decimal(P/S) |
NUMERIC or BIG_NUMERIC depending on precision |
date |
DATE |
time |
TIME |
timestamp |
DATETIME |
timestamptz |
TIMESTAMP |
string |
STRING |
uuid |
BYTES |
fixed(L) |
BYTES |
binary |
BYTES |
list<Type> |
ARRAY<Type> |
struct |
STRUCT |
map<KeyType, ValueType> |
ARRAY<Struct<key KeyType, value ValueType>> |
Limitações
As tabelas somente leitura do Iceberg têm limitações de tabelas externas e as seguintes limitações:
As tabelas que usam a mesclagem na leitura têm as seguintes limitações:
- Cada arquivo de dados pode ser associado a até 10.000 arquivos de exclusão.
- Não é possível aplicar mais de 100.000 IDs de igualdade a um arquivo de exclusão.
- Para contornar essas limitações, compacte os arquivos de exclusão com frequência ou crie uma visualização na tabela do Iceberg que evite partições mutáveis com frequência.
O BigQuery é compatível com a remoção de manifesto usando todas as funções de transformação de partição do Iceberg, exceto
Bucket
. Para saber mais sobre como remover partições, consulte Consultar tabelas particionadas. As consultas que fazem referência a tabelas Iceberg somente leitura precisam conter literais em predicados em comparação com colunas particionadas.Somente arquivos de dados do Apache Parquet são compatíveis.
Custos de mesclagem na leitura
O faturamento sob demanda para dados de mesclagem na leitura é a soma das verificações dos seguintes dados:
- Todos os bytes lógicos lidos no arquivo de dados, incluindo linhas marcadas como excluídas por posição e exclusões de igualdade.
- Bytes lógicos lidos ao carregar os arquivos de exclusão de igualdade e de posição para encontrar as linhas excluídas em um arquivo de dados.
Exigir filtro de particionamento
É possível exigir o uso de filtros de predicado ativando a opção
Exigir filtro de partição para sua tabela do Iceberg.
Se você ativar essa opção, as tentativas de consultar a tabela sem especificar uma
cláusula WHERE
que se alinha a cada arquivo de manifesto produzirão o seguinte erro:
Cannot query over table project_id.dataset.table without a filter that can be used for partition elimination.
Cada arquivo de manifesto requer pelo menos um predicado adequado para a eliminação de partições.
É possível ativar o require_partition_filter
das seguintes maneiras ao criar uma tabela Iceberg :
SQL
Use a instrução CREATE EXTERNAL TABLE
.O exemplo a seguir
cria uma tabela somente leitura do Iceberg chamada
TABLE
com o filtro de partição necessário ativado:
CREATE EXTERNAL TABLE TABLE WITH CONNECTION `PROJECT_ID.REGION.CONNECTION_ID` OPTIONS ( format = 'ICEBERG', uris = [URI], require_partition_filter = true )
Substitua:
TABLE
: o nome da tabela que você quer criar.PROJECT_ID
: o ID do projeto que contém a tabela que você quer criarREGION
: o local em que você quer criar a tabela Iceberg.CONNECTION_ID
: o ID da conexão. Por exemplo,myconnection
.URI
: o URI do Cloud Storage com o arquivo de metadados JSON mais recentePor exemplo,
gs://mybucket/us/iceberg/mytable/metadata/1234.metadata.json
O URI também pode apontar para um local externo de nuvem. como Amazon S3 ou Azure Blob Storage.
- Exemplo para a AWS:
s3://mybucket/iceberg/metadata/1234.metadata.json
. - Exemplo do Azure:
azure://mystorageaccount.blob.core.windows.net/mycontainer/iceberg/metadata/1234.metadata.json
.
- Exemplo para a AWS:
bq
Use o comando bq mk --table
com o decorador @connection
para especificar a conexão a ser usada no final
do parâmetro --external_table_definition
.
Use --require_partition_filter
para ativar o filtro de partição exigido.
No exemplo a seguir, criamos uma tabela somente leitura do Iceberg chamada
TABLE
com o recurso "Exigir filtro de partição ativado":
bq mk \ --table \ --external_table_definition=ICEBERG=URI@projects/CONNECTION_PROJECT_ID/locations/CONNECTION_REGION/connections/CONNECTION_ID \ PROJECT_ID:DATASET.EXTERNAL_TABLE \ --require_partition_filter
Substitua:
URI
: o arquivo de metadados JSON mais recente para um snapshot de tabela específicaPor exemplo,
gs://mybucket/mydata/mytable/metadata/iceberg.metadata.json
O URI também pode apontar para um local externo de nuvem. como Amazon S3 ou Azure Blob Storage.
- Exemplo para a AWS:
s3://mybucket/iceberg/metadata/1234.metadata.json
. - Exemplo do Azure:
azure://mystorageaccount.blob.core.windows.net/mycontainer/iceberg/metadata/1234.metadata.json
.
- Exemplo para a AWS:
CONNECTION_PROJECT_ID
: o projeto que contém a conexão para criar a tabela somente leitura do Iceberg. Por exemplo,myproject
CONNECTION_REGION
: a região que contém a conexão para criar a tabela somente leitura do Iceberg. Por exemplo,us
.CONNECTION_ID
: o ID da conexão. Por exemplo,myconnection
.Quando você visualiza os detalhes da conexão no console do Google Cloud , o ID da conexão é o valor na última seção do ID da conexão totalmente qualificado, mostrado em ID da conexão, por exemplo,
projects/myproject/locations/connection_location/connections/myconnection
.DATASET
: o nome do BigQueryconjunto de dados que contém a tabela que você quer atualizar. Por exemplo,
mydataset
EXTERNAL_TABLE
: o nome da tabela que você quer criarPor exemplo,
mytable
Você também pode atualizar sua tabela do Iceberg para ativar o filtro de partição necessário.
Se você não ativar a opção Exigir filtro de partição ao criar a tabela particionada, será possível atualizá-la para adicionar a opção.
bq
Use o comando bq update
e forneça a sinalização --require_partition_filter
.
Exemplo:
Para atualizar mypartitionedtable
em mydataset
no seu projeto padrão,
insira:
bq update --require_partition_filter PROJECT_ID:DATASET.TABLE
A seguir
- Saiba mais sobre o procedimento armazenado para o Spark.
- Saiba mais sobre políticas de controle de acesso.
- Saiba mais sobre como executar consultas no BigQuery.
- Saiba mais sobre as instruções compatíveis e os dialetos SQL no BigQuery.