Crie tabelas externas do BigLake para o Delta Lake

O BigLake permite-lhe aceder a tabelas Delta Lake com um controlo de acesso mais detalhado. O Delta Lake é um formato de armazenamento de dados tabulares de código aberto desenvolvido pela Databricks que suporta tabelas de dados à escala de petabytes.

O BigQuery suporta as seguintes funcionalidades com 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 dissocia o acesso à tabela Delta Lake do acesso ao repositório de dados subjacente.
  • Controlo de acesso detalhado: aplique segurança detalhada ao nível da tabela, incluindo segurança ao nível da linha e ao nível da coluna. Para tabelas do Delta Lake baseadas no Cloud Storage, também pode usar a ocultação dinâmica de dados.
  • Evolução do esquema: as alterações ao esquema nas tabelas do Delta Lake são detetadas automaticamente. As alterações ao esquema são refletidas na tabela do BigQuery.

As tabelas Delta Lake também suportam todas as funcionalidades do BigLake quando as configura como tabelas BigLake.

Antes de começar

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

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

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

  3. Enable the BigQuery Connection and BigQuery Reservation APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

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

    Activate Cloud Shell

  5. Certifique-se de que tem um conjunto de dados do BigQuery.

  6. Certifique-se de que a versão do Google Cloud SDK é a 366.0.0 ou posterior:

    gcloud version
    

    Se necessário, atualize o SDK do Google Cloud.

  7. Crie uma associação de recursos na nuvem com base na sua origem de dados externa e conceda a essa associação acesso ao Cloud Storage. Se não tiver as autorizações adequadas para criar uma ligação, peça ao administrador do BigQuery para criar uma ligação e partilhá-la consigo.

  8. Funções necessárias

    São necessárias as seguintes autorizações para criar uma tabela do Delta Lake:

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

    A função predefinida de administrador do BigQuery (roles/bigquery.admin) do Identity and Access Management inclui estas autorizações.

    Se não for um principal nesta função, peça ao seu administrador para lhe conceder estas autorizações ou para criar a tabela do Delta Lake por si.

    Além disso, para permitir que os utilizadores do BigQuery consultem a tabela, a conta de serviço associada à ligação tem de ter a seguinte autorização e acesso:

    • Função de leitor do BigQuery (roles/bigquery.viewer)
    • Função de utilizador de ligação do BigQuery (roles/bigquery.connectionUser)
    • Acesso ao contentor do Cloud Storage que contém esses dados

    Para mais informações sobre as funções e as autorizações de gestão de identidades e acessos no BigQuery, consulte o artigo Funções e autorizações predefinidas.

    Crie tabelas com o Delta Lake

    Para criar tabelas Delta Lake, siga estes passos.

    SQL

    Use a declaraçã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 no qual quer criar a tabela do Delta Lake
    • DATASET: o conjunto de dados do BigQuery que vai conter a tabela Delta Lake
    • DELTALAKE_TABLE_NAME: o nome da sua tabela Delta Lake
    • REGION: a região que contém a ligação para criar a tabela do Delta Lake, por exemplo, us
    • CONNECTION_ID: o ID de associação, por exemplo, myconnection

      Quando vê os detalhes da ligação na Google Cloud consola, o ID da ligação é o valor na última secção do ID da ligação totalmente qualificado apresentado em ID da ligação, por exemplo, projects/myproject/locations/connection_location/connections/myconnection.

    • DELTA_TABLE_GCS_BASE_PATH: o prefixo da tabela Delta Lake

    bq

    Num ambiente de linha de comandos, use o comando bq mk para criar a tabela 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 ficheiro de definição de tabela
    • PROJECT_ID: o ID do projeto no qual quer criar a tabela do Delta Lake
    • DATASET: o conjunto de dados do BigQuery que vai conter a tabela Delta Lake
    • DELTALAKE_TABLE_NAME: o nome da sua tabela Delta Lake

    REST

    Use a API BigQuery para criar uma tabela Delta Lake chamando o método 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 no qual quer criar a tabela do Delta Lake
    • REGION: a região que contém a ligação para criar a tabela do Delta Lake, por exemplo, us
    • CONNECTION_ID: o ID de associação, por exemplo, myconnection

      Quando vê os detalhes da ligação na Google Cloud consola, o ID da ligação é o valor na última secção do ID da ligação totalmente qualificado apresentado em ID da ligação, por exemplo, projects/myproject/locations/connection_location/connections/myconnection.

    • DELTA_TABLE_GCS_BASE_PATH: o prefixo da tabela Delta Lake

    • DELTALAKE_TABLE_NAME: o nome da sua tabela Delta Lake

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

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

    Embora possa criar tabelas externas do Delta Lake sem uma ligação, não é recomendado pelos seguintes motivos:

    • Os utilizadores podem deparar-se com erros ACCESS_DENIED ao tentar aceder a ficheiros no Cloud Storage.
    • As funcionalidades, como o controlo de acesso detalhado, só estão disponíveis em tabelas do BigLake do Delta Lake.

    Atualize tabelas do Delta Lake

    Para atualizar (atualizar) o esquema das tabelas Delta Lake, siga estes passos.

    bq

    Num ambiente de linha de comandos, use o comando bq update para atualizar (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 no qual quer criar a tabela do Delta Lake
    • DATASET: o conjunto de dados do BigQuery que vai conter a tabela Delta Lake
    • DELTALAKE_TABLE_NAME: o nome da sua tabela 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 Delta Lake
    • PROJECT_ID: o ID do projeto no qual quer criar a tabela do Delta Lake
    • REGION: a região que contém a ligação para criar a tabela do Delta Lake, por exemplo, us
    • CONNECTION_ID: o ID de associação, por exemplo, myconnection

      Quando vê os detalhes da ligação na Google Cloud consola, o ID da ligação é o valor na última secção do ID da ligação totalmente qualificado apresentado em ID da ligação, por exemplo, projects/myproject/locations/connection_location/connections/myconnection.

    • DELTALAKE_TABLE_NAME: o nome da sua tabela Delta Lake

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

    Consultar tabelas do Delta Lake

    Depois de criar uma tabela do BigLake Delta Lake, pode consultá-la através da sintaxe do GoogleSQL, tal como faria com uma tabela padrão do BigQuery. Por exemplo:

    SELECT field1, field2 FROM mydataset.my_cloud_storage_table;
    

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

    É usada uma associação externa associada a uma conta de serviço para estabelecer ligação ao repositório de dados. Uma vez que a conta de serviço obtém dados do repositório de dados, os utilizadores só precisam de acesso à tabela do Delta Lake.

    Mapeamento de dados

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

    Tipo de Delta Lake Tipo do BigQuery
    boolean BOOL
    byte INT64
    int INT64
    long INT64
    float FLOAT64
    double FLOAT64
    Decimal(P/S) NUMERIC ou BIG_NUMERIC, consoante a 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 Delta Lake têm limitações de tabelas BigLake e também as seguintes limitações:

    • Suporta a versão 3 do leitor Delta Lake com vetores de eliminação de caminhos relativos e mapeamento de colunas.
    • Não suporta pontos de verificação do Delta Lake V2.
    • Tem de indicar a versão do leitor no último ficheiro de entrada do registo. Por exemplo, as novas tabelas têm de incluir 00000..0.json.
    • As operações de captura de dados de alterações (CDC) não são suportadas. Todas as operações de CDC existentes são ignoradas.
    • O esquema é detetado automaticamente. A modificação do esquema através do BigQuery não é suportada.
    • Os nomes das colunas das tabelas têm de cumprir as restrições de nomes de colunas do BigQuery.
    • As vistas materializadas não são suportadas.
    • A API Read não é suportada para o Delta Lake.

    Resolução de problemas

    Esta secção fornece ajuda com as tabelas Delta Lake BigLake. Para obter ajuda mais geral com a resolução de problemas de consultas do BigQuery, consulte o artigo Resolva problemas de consultas.

    Limite de tempo da consulta e erros de recursos

    Verifique o diretório de registos (gs://bucket/warehouse/basictable/_delta_log) da tabela Delta Lake e procure ficheiros JSON com um número de versão superior ao ponto de verificação anterior. Pode obter o número da versão listando o diretório ou inspecionando o ficheiro _delta_log/_last_checkpoint. Os ficheiros JSON com mais de 10 MiB podem abrandar a expansão da tabela, o que pode originar problemas de tempo limite e de recursos. Para resolver este problema, use o seguinte comando para criar um novo ponto de verificação para que as consultas ignorem a leitura dos ficheiros JSON:

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

    Em seguida, os utilizadores podem usar o mesmo comando para repor o intervalo de pontos de verificação para o valor predefinido de 10 ou para um valor que evite ter mais de 50 MB de ficheiros JSON entre os pontos de verificação.

    Nome da coluna inválido

    Certifique-se de que o mapeamento de colunas está ativado para a tabela Delta Lake. O mapeamento de colunas é suportado com a versão 2 ou superior do leitor. Para a versão 1 do leitor, 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 cumprir as restrições de nomes de colunas flexíveis, contacte o apoio técnico ao cliente do Google Cloud ou biglake-help@google.com.

    Erros de acesso negado

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

    Desempenho

    Para melhorar o desempenho das consultas, experimente os seguintes passos:

    • Use as utilidades do Delta Lake para compactar os ficheiros de dados subjacentes e remover ficheiros redundantes, como dados e metadados.

    • Certifique-se de que delta.checkpoint.writeStatsAsStruct está definido como true.

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

    Os conjuntos de dados grandes (superiores a 100 TB) podem beneficiar de configurações e funcionalidades adicionais. Se os passos anteriores não resolverem os seus problemas, considere contactar o Apoio ao Cliente ou biglake-help@google.com, especialmente para conjuntos de dados com mais de 100 TB.