Criar tabelas externas do BigLake para o Delta Lake

Com o BigLake, é possível acessar as tabelas do Delta Lake com controle de acesso mais granular. Delta Lake é um formato de armazenamento de dados tabulares de código aberto desenvolvido pelo Databricks que oferece suporte a tabelas de dados em escala de petabytes.

O BigQuery oferece suporte aos seguintes recursos com as tabelas Delta Lake:

  • Delegação de acesso: consulte dados estruturados em repositórios de dados externos com delegação de acesso. A delegação de acesso separa o acesso à tabela Delta Lake do acesso ao armazenamento de dados subjacente.
  • Controle de acesso granular: aplique uma segurança refinada no nível da tabela, incluindo segurança de nível de linha e nível de coluna. Para tabelas Delta Lake baseadas no Cloud Storage, também é possível usar máscara de dados dinâmica.
  • Evolução do esquema: as alterações de esquema nas tabelas de Delta Lake são detectadas automaticamente. As alterações no esquema são refletidas na tabela do BigQuery.

As tabelas do Delta Lake também são compatíveis com todos os recursos do BigLake quando você os configura como tabelas do BigLake.

Antes de começar

    1. In the Trusted Cloud console, on the project selector page, select or create a Trusted Cloud project.

      Go to project selector

    2. Verify that billing is enabled for your Trusted Cloud project.

    3. Enable the BigQuery Connection and BigQuery Reservation APIs.

      Enable the APIs

    4. In the Trusted Cloud console, activate Cloud Shell.

      Activate Cloud Shell

    5. Verifique se você tem um conjunto de dados do BigQuery.

    6. Verifique se a versão do SDK Google Cloud é a 366.0.0 ou mais recente:

      gcloud version
      

      Se necessário, atualize o SDK Google Cloud.

    7. Crie uma conexão de recursos do Cloud com base na sua fonte de dados externa e conceda a ela acesso ao Cloud Storage. Se você não tiver as permissões apropriadas para criar uma conexão, peça ao administrador do BigQuery para criar uma conexão e compartilhá-la com você.

    8. Funções exigidas

      As seguintes permissões são necessárias para criar uma tabela Delta Lake:

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

      O papel predefinido do Identity and Access Management do BigQuery Admin (roles/bigquery.admin) inclui essas permissões.

      Se você não for o principal nesse papel, peça ao administrador que conceda essas permissões ou crie a tabela Delta Lake para você.

      Além disso, para permitir que os usuários do BigQuery consultem a tabela, a conta de serviço associada à conexão precisa ter as seguintes permissões e acesso:

      • Papel de leitor do BigQuery (roles/bigquery.viewer)
      • Papel de usuário de conexão do BigQuery (roles/bigquery.connectionUser)
      • Acesso ao bucket do Cloud Storage que contém os dados

      Para mais informações sobre os papéis e as permissões do Identity and Access Management no BigQuery, consulte Papéis e permissões predefinidos.

      Criar tabelas com o Delta Lake

      Para criar tabelas de Delta Lake, siga estas etapas.

      SQL

      Use a instrução CREATE EXTERNAL TABLE para criar a tabela do Delta Lake:

      CREATE EXTERNAL TABLE `PROJECT_ID.DATASET.DELTALAKE_TABLE_NAME`
      WITH CONNECTION `PROJECT_ID.REGION.CONNECTION_ID`
      OPTIONS (
        format ="DELTA_LAKE",
        uris=['DELTA_TABLE_GCS_BASE_PATH']);
      

      Substitua os seguintes valores:

      • PROJECT_ID: o ID do projeto em que você quer criar a tabela do Delta Lake
      • DATASET: o conjunto de dados do BigQuery para conter a tabela do Delta Lake
      • DELTALAKE_TABLE_NAME: o nome da sua tabela do Delta Lake
      • REGION: a região que contém a conexão para criar a tabela do Delta Lake, por exemplo, us
      • CONNECTION_ID: o ID da conexão. Por exemplo, myconnection

        Quando você visualiza os detalhes da conexão no console do Trusted Cloud , o ID da conexão é o valor na última seção do ID totalmente qualificado, mostrado em ID da conexão, por exemplo, projects/myproject/locations/connection_location/connections/myconnection.

      • DELTA_TABLE_GCS_BASE_PATH: o prefixo da tabela do Delta Lake.

      bq

      Em um ambiente de linha de comando, use o comando bq mk para criar a tabela do Delta Lake:

      bq mk --table --external_table_definition=DEFINITION_FILE PROJECT_ID:DATASET.DELTALAKE_TABLE_NAME
      

      Substitua os seguintes valores:

      • DEFINITION_FILE: o caminho para um arquivo de definição da tabela
      • PROJECT_ID: o ID do projeto em que você quer criar a tabela do Delta Lake
      • DATASET: o conjunto de dados do BigQuery para conter a tabela do Delta Lake
      • DELTALAKE_TABLE_NAME: o nome da sua tabela do Delta Lake

      REST

      Use a API BigQuery para criar uma tabela do Delta Lake chamando o método da API tables.insert:

      REQUEST='{
        "autodetect": true,
        "externalDataConfiguration": {
        "sourceFormat": "DELTA_LAKE",
        "connectionId": "PROJECT_ID.REGION.CONNECTION_ID",
        "sourceUris": [
          "DELTA_TABLE_GCS_BASE_PATH"
        ],
       },
      "tableReference": {
      "tableId": "DELTALAKE_TABLE_NAME"
      }
      }'
      
      echo $REQUEST | curl -X POST -d @- -H "Content-Type: application/json" -H "Authorization: Bearer $(gcloud auth print-access-token)" https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT_ID/datasets/DATASET/tables?autodetect_schema=true
      

      Substitua os seguintes valores:

      • PROJECT_ID: o ID do projeto em que você quer criar a tabela do Delta Lake
      • REGION: a região que contém a conexão para criar a tabela do Delta Lake, por exemplo, us
      • CONNECTION_ID: o ID da conexão. Por exemplo, myconnection

        Quando você visualiza os detalhes da conexão no console do Trusted Cloud , o ID da conexão é o valor na última seção do ID totalmente qualificado, mostrado em ID da conexão, por exemplo, projects/myproject/locations/connection_location/connections/myconnection.

      • DELTA_TABLE_GCS_BASE_PATH: o prefixo da tabela do Delta Lake.

      • DELTALAKE_TABLE_NAME: o nome da sua tabela do Delta Lake

      • DATASET: o conjunto de dados do BigQuery para conter a tabela do Delta Lake

      Quando você cria tabelas do Delta Lake, o prefixo Delta Lake é usado como o URI da tabela. Por exemplo, para uma tabela que tem registros no bucket gs://bucket/warehouse/basictable/_delta_log, o URI da tabela é gs://bucket/warehouse/basictable. Quando você executa consultas na tabela do Delta Lake, o BigQuery lê dados sob o prefixo para identificar a versão atual da tabela e, em seguida, calcula os metadados e os arquivos da tabela.

      Embora seja possível criar tabelas externas do Delta Lake sem uma conexão, isso não é recomendado pelos seguintes motivos:

      • Os usuários podem encontrar erros ACCESS_DENIED ao tentar acessar arquivos no Cloud Storage.
      • Recursos como controle de acesso refinado só estão disponíveis em tabelas do BigLake do Delta Lake.

      Atualizar tabelas do Delta Lake

      Para atualizar o esquema das tabelas do Delta Lake, siga estas etapas.

      bq

      Em um ambiente de linha de comando, use o comando bq update para atualizar o esquema da tabela do Delta Lake:

      bq update --autodetect_schema PROJECT_ID:DATASET.DELTALAKE_TABLE_NAME
      

      Substitua os seguintes valores:

      • PROJECT_ID: o ID do projeto em que você quer criar a tabela do Delta Lake
      • DATASET: o conjunto de dados do BigQuery para conter a tabela do Delta Lake
      • DELTALAKE_TABLE_NAME: o nome da sua tabela do Delta Lake

      REST

      Use a API BigQuery para atualizar uma tabela do Delta Lake chamando o método da API tables.patch:

      REQUEST='{
        "externalDataConfiguration": {
          "sourceFormat": "DELTA_LAKE",
          "sourceUris": [
            "DELTA_TABLE_GCS_BASE_PATH"
          ],
          "connectionId": "PROJECT_ID.REGION.CONNECTION_ID",
          "autodetect": true
        }
      }'
      echo $REQUEST |curl -X PATCH -d @- -H "Content-Type: application/json" -H "Authorization: Bearer $(gcloud auth print-access-token)" https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT_ID/datasets/DATASET/tables/DELTALAKE_TABLE_NAME?autodetect_schema=true
      

      Substitua os seguintes valores:

      • DELTA_TABLE_GCS_BASE_PATH: o prefixo da tabela do Delta Lake.
      • PROJECT_ID: o ID do projeto em que você quer criar a tabela do Delta Lake
      • REGION: a região que contém a conexão para criar a tabela do Delta Lake, por exemplo, us
      • CONNECTION_ID: o ID da conexão. Por exemplo, myconnection

        Quando você visualiza os detalhes da conexão no console do Trusted Cloud , o ID da conexão é o valor na última seção do ID totalmente qualificado, mostrado em ID da conexão, por exemplo, projects/myproject/locations/connection_location/connections/myconnection.

      • DELTALAKE_TABLE_NAME: o nome da sua tabela do Delta Lake

      • DATASET: o conjunto de dados do BigQuery para conter a tabela do Delta Lake

      Consultar tabelas do Delta Lake

      Depois de criar uma tabela do BigLake do Delta Lake, será possível consultá-la usando a sintaxe do GoogleSQL, da mesma forma que você faria com uma tabela padrão do BigQuery. Por exemplo:

      SELECT field1, field2 FROM mydataset.my_cloud_storage_table;
      

      Para mais informações, consulte Consultar dados do Cloud Storage em tabelas do BigLake.

      Uma conexão externa associada a uma conta de serviço é usada para se conectar ao repositório de dados. Como a conta de serviço recupera dados do repositório de dados, os usuários só precisam acessar a tabela do Delta Lake.

      Mapeamento de dados

      O BigQuery converte tipos de dados do Delta Lake em tipos de dados do BigQuery, conforme mostrado na tabela a seguir:

      Tipo do Delta Lake Tipo do BigQuery
      boolean BOOL
      byte INT64
      int INT64
      long INT64
      float FLOAT64
      double FLOAT64
      Decimal(P/S) NUMERIC ou BIG_NUMERIC, dependendo da precisão
      date DATE
      time TIME
      timestamp (not partition column) TIMESTAMP
      timestamp (partition column) DATETIME
      string STRING
      binary BYTES
      array<Type> ARRAY<Type>
      struct STRUCT
      map<KeyType, ValueType> ARRAY<Struct<key KeyType, value ValueType>>

      Limitações

      As tabelas do Delta Lake têm limitações das tabelas do BigLake e também as seguintes limitações:

      • Oferece suporte à versão de leitor 3 do Delta Lake com vetores de exclusão de caminho relativo e mapeamento de colunas.
      • Não oferece suporte a pontos de verificação do Delta Lake V2.
      • Liste a versão do leitor no último arquivo de entrada de registro. Por exemplo, novas tabelas precisam incluir 00000..0.json.
      • As operações de captura de dados alterados (CDC) não são compatíveis. Todas as operações de CDC existentes serão ignoradas.
      • O esquema é detectado automaticamente. Não é possível modificar o esquema usando o BigQuery.
      • Os nomes das colunas da tabela precisam aderir às restrições de nome de coluna do BigQuery.
      • Não há suporte para visualizações materializadas.
      • A API Read não é compatível com o Delta Lake.

      Solução de problemas

      Esta seção ajuda com as tabelas do Delta Lake BigLake. Para mais ajuda geral com a solução de problemas de consultas do BigQuery, consulte Resolver problemas de consultas.

      Erros de tempo limite da consulta e de recursos

      Verifique o diretório de registros (gs://bucket/warehouse/basictable/_delta_log) da tabela do Delta Lake e procure arquivos JSON com um número de versão maior que o ponto de verificação anterior. Para saber o número da versão, liste o diretório ou inspecione o arquivo _delta_log/_last_checkpoint. Arquivos JSON maiores que 10 MiB podem diminuir a expansão da tabela, o que pode causar problemas de tempo limite e recursos. Para resolver esse problema, use o comando a seguir para criar um novo ponto de verificação e fazer com que as consultas pulem a leitura dos arquivos JSON:

        spark.sql("ALTER TABLE delta.`gs://bucket/mydeltatabledir` SET TBLPROPERTIES ('delta.checkpointInterval' = '1')");
      

      Em seguida, os usuários podem usar o mesmo comando para redefinir o intervalo de checkpoint para o valor padrão de 10 ou para um valor que evite ter mais de 50 MB de arquivos JSON entre os checkpoints.

      Nome de coluna inválido

      Verifique se o mapeamento de colunas está ativado para a tabela do Delta Lake. O mapeamento de colunas é compatível com o Reader versão 2 ou mais recente. Para o Reader versão 1, defina "delta.columnMapping.mode" como "name" usando o seguinte comando:

      spark.sql("ALTER TABLE delta.`gs://bucket/mydeltatabledir` SET TBLPROPERTIES ('delta.columnMapping.mode' = 'name', 'delta.minReaderVersion' = '3', 'delta.minWriterVersion' = '7')");
      

      Se o nome de coluna inválido obedecer às restrições de nome de coluna flexíveis, entre em contato com o Suporte ao cliente do Cloud ou biglake-help@google.com.

      Erros de acesso negado

      Para diagnosticar problemas com tabelas do BigLake do Delta Lake, verifique o seguinte:

      Desempenho

      Para melhorar o desempenho da consulta, siga estas etapas:

      • Use os utilitários do Delta Lake para compactar os arquivos de dados subjacentes e remover arquivos redundantes, como dados e metadados.

      • Verifique se delta.checkpoint.writeStatsAsStruct está definido como true.

      • Verifique se as variáveis usadas com frequência em cláusulas de predicado estão em colunas de partição.

      Conjuntos de dados grandes (mais de 100 TB) podem se beneficiar de outras configurações e recursos. Se as etapas anteriores não resolverem seus problemas, entre em contato com o atendimento ao cliente ou biglake-help@google.com, principalmente para conjuntos de dados maiores que 100 TB.