Criar tabelas de objetos

Neste documento, descrevemos como acessar dados não estruturados no BigQuery criando uma tabela de objetos.

Para criar uma tabela de objetos, conclua as seguintes tarefas:

  1. Crie uma conexão para ler informações do objeto do Cloud Storage.
  2. Conceda permissão para ler informações do Cloud Storage na conta de serviço associada à conexão.
  3. Crie e associe a tabela de objetos à conexão usando a instrução CREATE EXTERNAL TABLE.

Antes de começar

  1. Faça login na sua conta do Google Cloud. Se você começou a usar o Google Cloud agora, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
  2. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  3. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  4. Ative as APIs BigQuery and BigQuery Connection API.

    Ative as APIs

  5. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  6. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  7. Ative as APIs BigQuery and BigQuery Connection API.

    Ative as APIs

  8. Verifique se o administrador do BigQuery criou uma conexão e configurou o acesso ao Cloud Storage.

Papéis obrigatórios

Para trabalhar com tabelas de objetos, seus usuários precisam das seguintes permissões do IAM com base no papel na organização. Para mais informações sobre papéis do usuário, consulte Modelo de segurança. Para mais informações sobre como conceder permissões, consulte Como visualizar os papéis atribuíveis em recursos.

  • Administrador do data lake

    Para receber as permissões necessárias para se conectar ao Cloud Storage, peça ao administrador para conceder a você o papel de Administrador de conexão do BigQuery (roles/bigquery.connectionAdmin) no projeto.

    Para receber as permissões necessárias para criar e gerenciar buckets do Cloud Storage, peça ao administrador para conceder a você o papel de Administrador do Storage (roles/storage.admin) no projeto.

    Esse papel predefinido contém as permissões necessárias para se conectar ao Cloud Storage e criar e gerenciar buckets dele. Para acessar as permissões exatas necessárias, expanda a seção Permissões necessárias:

    Permissões necessárias

    • bigquery.connections.create
    • bigquery.connections.get
    • bigquery.connections.list
    • bigquery.connections.update
    • bigquery.connections.use
    • bigquery.connections.delete
    • storage.bucket.*
    • storage.object.*

  • Administrador de data warehouse

    Para receber as permissões necessárias para criar tabelas de objetos, peça ao administrador para conceder a você os seguintes papéis no projeto:

    • Papel de editor de dados do BigQuery (roles/bigquery.dataEditor).
    • Papel de administrador de conexão do BigQuery (roles/bigquery.connectionAdmin).

    Esse papel predefinido contém as permissões necessárias para criar tabelas de objetos. Para acessar as permissões exatas necessárias, expanda a seção Permissões necessárias:

    Permissões necessárias

    • bigquery.tables.create
    • bigquery.tables.update
    • bigquery.connections.delegate

  • Analista de dados

    Para ter as permissões necessárias para consultar tabelas de objetos, peça ao administrador que conceda a você os seguintes papéis no projeto:

    • Papel de leitor de dados do BigQuery (roles/bigquery.dataViewer)
    • Papel de usuário de conexão do BigQuery (roles/bigquery.connectionUser)

    Esse papel predefinido contém as permissões necessárias para consultar tabelas de objetos. Para acessar as permissões exatas necessárias, expanda a seção Permissões necessárias:

    Permissões necessárias

    • bigquery.jobs.create
    • bigquery.tables.get
    • bigquery.tables.getData
    • bigquery.readsessions.create

    Essas permissões também podem ser concedidas com papéis personalizados ou outros papéis predefinidos.

Criar tabelas de objetos

Antes de criar uma tabela de objetos, é necessário ter um conjunto de dados para conter a tabela. Para mais informações, consulte Como criar conjuntos de dados.

Para criar uma tabela de objetos:

SQL

Use a instrução CREATE EXTERNAL TABLE.

  1. No Console do Google Cloud, acesse a página BigQuery.

    Ir para o BigQuery

  2. No editor de consultas, digite a seguinte instrução:

    CREATE EXTERNAL TABLE `PROJECT_ID.DATASET_ID.TABLE_NAME`
    WITH CONNECTION `PROJECT_ID.REGION.CONNECTION_ID`
    OPTIONS(
      object_metadata = 'SIMPLE',
      uris = ['BUCKET_PATH'[,...]],
      max_staleness = STALENESS_INTERVAL,
      metadata_cache_mode = 'CACHE_MODE');
    

    Substitua:

    • PROJECT_ID: o ID do projeto
    • DATASET_ID: o ID do conjunto de dados que contém a tabela de objetos.
    • TABLE_NAME: o nome da tabela de objetos.
    • REGION: a região ou multirregião que contém a conexão.
    • CONNECTION_ID: o ID da conexão de recursos da nuvem a ser usada com essa tabela de objetos. A conexão determina qual conta de serviço é usada para ler dados a partir do Cloud Storage.

      Quando você visualiza os detalhes da conexão no console do Google Cloud, esse é 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.

    • BUCKET_PATH: o caminho para o bucket do Cloud Storage que contém os objetos representados pela tabela de objetos, no formato ['gs://bucket_name/[folder_name/]*'].

      É possível usar um caractere curinga de asterisco (*) em cada caminho para limitar os objetos incluídos na tabela de objetos. Por exemplo, se o bucket contiver vários tipos de dados não estruturados, crie a tabela de objetos usando apenas objetos PDF especificando ['gs://bucket_name/*.pdf']. Para mais informações, consulte Compatibilidade de caracteres curinga com URIs do Cloud Storage.

      É possível especificar vários buckets para a opção uris fornecendo vários caminhos, por exemplo, ['gs://mybucket1/*', 'gs://mybucket2/folder5/*'].

      Para mais informações sobre o uso de URIs do Cloud Storage no BigQuery, consulte Caminho do recurso do Cloud Storage.

    • STALENESS_INTERVAL: especifica se os metadados em cache são usados pelas operações na tabela de objetos e se eles precisam ser atualizados para que possam ser usados pela operação. Para mais informações sobre considerações de armazenamento em cache de metadados, consulte Armazenamento em cache de metadados para desempenho.

      Para desativar o armazenamento em cache de metadados, especifique 0. Esse é o padrão.

      Para ativar o armazenamento em cache de metadados, especifique um valor de literal de intervalo entre 30 minutos e 7 dias. Por exemplo, especifique INTERVAL 4 HOUR para um intervalo de inatividade de 4 horas. Com esse valor, as operações na tabela usarão metadados em cache se tiverem sido atualizados nas últimas 4 horas. Se os metadados em cache forem anteriores a isso, a operação recuperará os metadados do Cloud Storage.

    • CACHE_MODE: especifica se o cache de metadados é atualizado de forma automática ou manual. Para mais informações sobre considerações de armazenamento em cache de metadados, consulte Armazenamento em cache de metadados para desempenho.

      Defina como AUTOMATIC para que o cache de metadados seja atualizado em um intervalo definido pelo sistema, geralmente entre 30 e 60 minutos.

      Defina como MANUAL se quiser atualizar o cache de metadados com uma programação que você determinar. Nesse caso, chame o procedimento do sistema BQ.REFRESH_EXTERNAL_METADATA_CACHE para atualizar o cache.

      Defina CACHE_MODE se STALENESS_INTERVAL estiver definido como um valor maior que 0.

  3. Clique em Executar.

Para mais informações sobre como executar consultas, acesse Executar uma consulta interativa.

Exemplos

No exemplo a seguir, criamos uma tabela de objetos com um intervalo de inatividade de cache de metadados de um dia:

CREATE EXTERNAL TABLE `my_dataset.object_table`
WITH CONNECTION `us.my-connection`
OPTIONS(
  object_metadata = 'SIMPLE',
  uris = ['gs://mybucket/*'],
  max_staleness = INTERVAL 1 DAY,
  metadata_cache_mode = 'AUTOMATIC'
);

No exemplo a seguir, criamos uma tabela sobre os objetos em três buckets do Cloud Storage:

CREATE EXTERNAL TABLE `my_dataset.object_table`
WITH CONNECTION `us.my-connection`
OPTIONS(
  object_metadata = 'SIMPLE',
  uris = ['gs://bucket1/*','gs://bucket2/folder1/*','gs://bucket3/*']
);

No exemplo a seguir, criamos uma tabela de objetos apenas com os objetos PDF em um bucket do Cloud Storage:

CREATE EXTERNAL TABLE `my_dataset.object_table`
WITH CONNECTION `us.my-connection`
OPTIONS(
  object_metadata = 'SIMPLE',
  uris = ['gs://bucket1/*.pdf']
);

bq

Use o comando bq mk.

bq mk --table \
--external_table_definition=BUCKET_PATH@REGION.CONNECTION_ID \
--object_metadata=SIMPLE \
--max_staleness=STALENESS_INTERVAL \
--metadata_cache_mode=CACHE_MODE \
PROJECT_ID:DATASET_ID.TABLE_NAME

Substitua:

  • PROJECT_ID: o ID do projeto
  • DATASET_ID: o ID do conjunto de dados que contém a tabela de objetos.
  • TABLE_NAME: o nome da tabela de objetos.
  • REGION: a região ou multirregião que contém a conexão.
  • CONNECTION_ID: o ID da conexão de recursos da nuvem a ser usada com essa tabela externa. A conexão determina qual conta de serviço é usada para ler dados a partir do Cloud Storage.

    Quando você visualiza os detalhes da conexão no console do Google Cloud, esse é 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.

  • BUCKET_PATH: o caminho para o bucket do Cloud Storage que contém os objetos representados pela tabela de objetos, no formato gs://bucket_name/[folder_name/]*.

    É possível usar um caractere curinga de asterisco (*) em cada caminho para limitar os objetos incluídos na tabela de objetos. Por exemplo, se o bucket contiver vários tipos de dados não estruturados, crie a tabela de objetos usando apenas objetos PDF especificando gs://bucket_name/*.pdf. Para mais informações, consulte Compatibilidade de caracteres curinga com URIs do Cloud Storage.

    É possível especificar vários buckets para a opção uris fornecendo vários caminhos, por exemplo, gs://mybucket1/*,gs://mybucket2/folder5/*.

    Para mais informações sobre o uso de URIs do Cloud Storage no BigQuery, consulte Caminho do recurso do Cloud Storage.

  • STALENESS_INTERVAL: especifica se os metadados em cache são usados pelas operações na tabela de objetos e se eles precisam ser atualizados para que possam ser usados pela operação. Para mais informações sobre considerações de armazenamento em cache de metadados, consulte Armazenamento em cache de metadados para desempenho.

    Para desativar o armazenamento em cache de metadados, especifique 0. Esse é o padrão.

    Para ativar o armazenamento em cache de metadados, especifique um valor de intervalo entre 30 minutos e 7 dias, usando o formato Y-M D H:M:S descrito na documentação do tipo de dados INTERVAL. Por exemplo, especifique 0-0 0 4:0:0 para um intervalo de inatividade de quatro horas. Com esse valor, as operações na tabela usarão metadados em cache se tiverem sido atualizados nas últimas 4 horas. Se os metadados em cache forem anteriores a isso, a operação recuperará os metadados do Cloud Storage.

  • CACHE_MODE: especifica se o cache de metadados é atualizado de forma automática ou manual. Para mais informações sobre considerações de armazenamento em cache de metadados, consulte Armazenamento em cache de metadados para desempenho.

    Defina como AUTOMATIC para que o cache de metadados seja atualizado em um intervalo definido pelo sistema, geralmente entre 30 e 60 minutos.

    Defina como MANUAL se quiser atualizar o cache de metadados com uma programação que você determinar. Nesse caso, chame o procedimento do sistema BQ.REFRESH_EXTERNAL_METADATA_CACHE para atualizar o cache.

    Defina CACHE_MODE se STALENESS_INTERVAL estiver definido como um valor maior que 0.

Exemplos

No exemplo a seguir, criamos uma tabela de objetos com um intervalo de inatividade de cache de metadados de um dia:

bq mk --table \
--external_table_definition=gs://mybucket/*@us.my-connection \
--object_metadata=SIMPLE \
--max_staleness=0-0 1 0:0:0 \
--metadata_cache_mode=AUTOMATIC \
my_dataset.object_table

No exemplo a seguir, criamos uma tabela sobre os objetos em três buckets do Cloud Storage:

bq mk --table \
--external_table_definition=gs://bucket1/*,gs://bucket2/folder1/*,gs://bucket3/*@us.my-connection \
--object_metadata=SIMPLE \
my_dataset.object_table

No exemplo a seguir, criamos uma tabela de objetos apenas com os objetos PDF em um bucket do Cloud Storage:

bq mk --table \
--external_table_definition=gs://bucket1/*.pdf@us.my-connection \
--object_metadata=SIMPLE \
my_dataset.object_table

API

Chame o método tables.insert. Inclua um objeto ExternalDataConfiguration com o campo objectMetadata definido como SIMPLE no recurso Table que você transmitir.

O exemplo a seguir mostra como chamar esse método usando curl:

ACCESS_TOKEN=$(gcloud auth print-access-token) curl \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-X POST \
-d '{"tableReference": {"projectId": "my_project", "datasetId": "my_dataset", "tableId": "object_table_name"}, "externalDataConfiguration": {"objectMetadata": "SIMPLE", "sourceUris": ["gs://mybucket/*"]}}' \
https://www.googleapis.com/bigquery/v2/projects/my_project/datasets/my_dataset/tables

Terraform

Neste exemplo, criamos uma tabela de objetos com o armazenamento em cache de metadados ativado com atualização manual.

Os principais campos a serem especificados para uma tabela de objetos são: google_bigquery_table.external_data_configuration.object_metadata, google_bigquery_table.external_data_configuration.metadata_cache_mode e google_bigquery_table.max_staleness de dois minutos. Para mais informações sobre cada recurso, consulte a documentação do Terraform no BigQuery.


# This queries the provider for project information.
data "google_project" "default" {}

# This creates a connection in the US region named "my-connection-id".
# This connection is used to access the bucket.
resource "google_bigquery_connection" "default" {
  connection_id = "my-connection-id"
  location      = "US"
  cloud_resource {}
}

# This grants the previous connection IAM role access to the bucket.
resource "google_project_iam_member" "default" {
  role    = "roles/storage.objectViewer"
  project = data.google_project.default.project_id
  member  = "serviceAccount:${google_bigquery_connection.default.cloud_resource[0].service_account_id}"
}

# This defines a Google BigQuery dataset.
resource "google_bigquery_dataset" "default" {
  dataset_id = "my_dataset_id"
}

# This creates a bucket in the US region named "my-bucket" with a pseudorandom suffix.
resource "random_id" "bucket_name_suffix" {
  byte_length = 8
}
resource "google_storage_bucket" "default" {
  name                        = "my-bucket-${random_id.bucket_name_suffix.hex}"
  location                    = "US"
  force_destroy               = true
  uniform_bucket_level_access = true
}

# This defines a BigQuery object table with manual metadata caching.
resource "google_bigquery_table" "default" {
  deletion_protection = false
  table_id            = "my-table-id"
  dataset_id          = google_bigquery_dataset.default.dataset_id
  external_data_configuration {
    connection_id = google_bigquery_connection.default.name
    autodetect    = false
    # `object_metadata is` required for object tables. For more information, see
    # https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/bigquery_table#object_metadata
    object_metadata = "SIMPLE"
    # This defines the source for the prior object table.
    source_uris = [
      "gs://${google_storage_bucket.default.name}/*",
    ]

    metadata_cache_mode = "MANUAL"
  }

  # This ensures that the connection can access the bucket
  # before Terraform creates a table.
  depends_on = [
    google_project_iam_member.default
  ]
}

Para aplicar a configuração do Terraform em um projeto do Google Cloud, conclua as etapas nas seções a seguir.

Preparar o Cloud Shell

  1. Inicie o Cloud Shell.
  2. Defina o projeto padrão do Google Cloud em que você quer aplicar as configurações do Terraform.

    Você só precisa executar esse comando uma vez por projeto, e ele pode ser executado em qualquer diretório.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    As variáveis de ambiente serão substituídas se você definir valores explícitos no arquivo de configuração do Terraform.

Preparar o diretório

Cada arquivo de configuração do Terraform precisa ter o próprio diretório, também chamado de módulo raiz.

  1. No Cloud Shell, crie um diretório e um novo arquivo dentro dele. O nome do arquivo precisa ter a extensão .tf, por exemplo, main.tf. Neste tutorial, o arquivo é chamado de main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. Se você estiver seguindo um tutorial, poderá copiar o exemplo de código em cada seção ou etapa.

    Copie o exemplo de código no main.tf recém-criado.

    Se preferir, copie o código do GitHub. Isso é recomendado quando o snippet do Terraform faz parte de uma solução de ponta a ponta.

  3. Revise e modifique os parâmetros de amostra para aplicar ao seu ambiente.
  4. Salve as alterações.
  5. Inicialize o Terraform. Você só precisa fazer isso uma vez por diretório.
    terraform init

    Opcionalmente, para usar a versão mais recente do provedor do Google, inclua a opção -upgrade:

    terraform init -upgrade

Aplique as alterações

  1. Revise a configuração e verifique se os recursos que o Terraform vai criar ou atualizar correspondem às suas expectativas:
    terraform plan

    Faça as correções necessárias na configuração.

  2. Para aplicar a configuração do Terraform, execute o comando a seguir e digite yes no prompt:
    terraform apply

    Aguarde até que o Terraform exiba a mensagem "Apply complete!".

  3. Abra seu projeto do Google Cloud para ver os resultados. No console do Google Cloud, navegue até seus recursos na IU para verificar se foram criados ou atualizados pelo Terraform.

Consultar tabelas de objetos

É possível consultar uma tabela de objetos como qualquer outro BigQuery, por exemplo:

SELECT *
FROM mydataset.myobjecttable;

Consultar uma tabela de objetos retorna metadados para eles. Para mais informações, consulte Esquema da tabela de objetos.

A seguir