Usar o metastore do BigLake com o catálogo REST do Iceberg

O catálogo REST gerenciado do Apache Iceberg no metastore do BigLake cria interoperabilidade entre todos os mecanismos de consulta, oferecendo uma única fonte de verdade para todos os dados do Iceberg. Ele permite que mecanismos de consulta, como o Apache Spark, descubram, leiam metadados e gerenciem tabelas do Iceberg de maneira consistente.

As tabelas do Iceberg usadas com o catálogo REST do Iceberg são chamadas de tabelas do BigLake para Apache Iceberg (versão prévia). São tabelas do Iceberg criadas com base em mecanismos de código aberto e armazenadas no Cloud Storage. Eles podem ser lidos por mecanismos de código aberto ou pelo BigQuery. As gravações são compatíveis apenas com mecanismos de código aberto. Neste documento, nos referimos a essas tabelas como tabelas do BigLake Iceberg.

Antes de começar

  1. Make sure that billing is enabled for your Google Cloud project.

    Saiba como verificar se o faturamento está ativado em um projeto.
  2. Enable the BigLake API.

    Enable the API

  3. Opcional: entenda como o BigLake Metastore funciona e por que você deve usá-lo.

Funções exigidas

Para receber as permissões necessárias para usar o catálogo REST do Iceberg no metastore do BigLake, peça ao administrador para conceder a você os seguintes papéis do IAM no projeto ou na conta de serviço:

Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.

Também é possível conseguir as permissões necessárias por meio de papéis personalizados ou de outros papéis predefinidos.

Limitações

O catálogo REST do Iceberg está sujeito às seguintes limitações:

Configurar um mecanismo de consulta com o catálogo REST do Iceberg

import google.auth
from google.auth.transport.requests import Request
from google.oauth2 import service_account
import pyspark
from pyspark.context import SparkContext
from pyspark.sql import SparkSession

catalog_name = "CATALOG_NAME"
spark = SparkSession.builder.appName("APP_NAME") \
    .config("spark.sql.defaultCatalog", catalog_name) \
    .config(f"spark.sql.catalog.{catalog_name}", "org.apache.iceberg.spark.SparkCatalog") \
    .config(f"spark.sql.catalog.{catalog_name}.type", "rest") \
    .config(f"spark.sql.catalog.{catalog_name}.uri","https://biglake.googleapis.com/iceberg/v1beta/restcatalog") \
    .config(f"spark.sql.catalog.{catalog_name}.warehouse", "gs://STORAGE_URI") \
    .config(f"spark.sql.catalog.{catalog_name}.token", "TOKEN") \
    .config(f"spark.sql.catalog.{catalog_name}.oauth2-server-uri", "https://oauth2.googleapis.com/token") \
    .config(f"spark.sql.catalog.{catalog_name}.header.x-goog-user-project", "PROJECT_ID") \
    .config("spark.sql.extensions","org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
    .config(f"spark.sql.catalog.{catalog_name}.io-impl","org.apache.iceberg.hadoop.HadoopFileIO") \
    .config(f"spark.sql.catalog.{catalog_name}.rest-metrics-reporting-enabled", "false") \
    .getOrCreate()

Substitua:

  • CATALOG_NAME: um nome para seu catálogo REST do Iceberg.
  • APP_NAME: um nome para a sessão do Spark.
  • STORAGE_URI: o URI do bucket do Cloud Storage que contém suas tabelas Iceberg do BigLake.
  • TOKEN: seu token de autenticação, que é válido por uma hora, por exemplo, gcloud auth application-default print-access-token.
  • PROJECT_ID: o projeto que recebe a cobrança pelo uso do catálogo REST do Iceberg, que pode ser diferente do projeto proprietário do bucket do Cloud Storage. Para detalhes sobre a configuração do projeto ao usar uma API REST, consulte Parâmetros do sistema.

Criar um namespace

spark.sql("CREATE NAMESPACE IF NOT EXISTS NAMESPACE_NAME;")

spark.sql("USE NAMESPACE_NAME;")

Substitua NAMESPACE_NAME por um nome para o namespace.

Criar uma tabela

spark.sql("CREATE TABLE TABLE_NAME (id int, data string) USING ICEBERG;")

spark.sql("DESCRIBE NAMESPACE_NAME.TABLE_NAME").show()

Substitua:

  • NAMESPACE_NAME: o nome do namespace.
  • TABLE_NAME: um nome para a tabela

Listar tabelas

spark.sql("SHOW TABLES").show()

Inserir dados na tabela

O exemplo a seguir insere dados de amostra na tabela:

spark.sql("INSERT INTO TABLE_NAME VALUES (1, \"first row\"), (2, \"second row\"), (3, \"third row\");")

Consultar uma tabela

O exemplo a seguir seleciona todos os dados da tabela:

spark.sql("SELECT * FROM TABLE_NAME;").show()

Alterar um esquema de tabela

O exemplo a seguir adiciona uma coluna à tabela:

spark.sql("ALTER TABLE TABLE_NAME ADD COLUMNS ( desc string);")
spark.sql("DESCRIBE NAMESPACE_NAME.TABLE_NAME").show()

Excluir uma tabela

O exemplo a seguir exclui a tabela do namespace especificado:

spark.sql("DROP TABLE TABLE_NAME;")

Preços

Para detalhes dos preços, consulte Preços do BigLake.

A seguir