Crear tablas externas de BigLake para Delta Lake

BigLake te permite acceder a las tablas de Delta Lake con un control de acceso más granular. Delta Lake es un formato de almacenamiento de datos tabulares de código abierto desarrollado por Databricks que admite tablas de datos a escala de petabytes.

BigQuery admite las siguientes funciones con tablas Delta Lake:

  • Delegación de acceso: consulta datos estructurados en almacenes de datos externos con delegación de acceso. La delegación de acceso desvincula el acceso a la tabla Delta Lake del acceso al almacén de datos subyacente.
  • Control de acceso pormenorizado: aplica una seguridad pormenorizada a nivel de tabla, incluida la seguridad a nivel de fila y a nivel de columna. En el caso de las tablas de Delta Lake basadas en Cloud Storage, también puedes usar el enmascaramiento dinámico de datos.
  • Evolución del esquema: los cambios en el esquema de las tablas Delta Lake se detectan automáticamente. Los cambios en el esquema se reflejan en la tabla de BigQuery.

Las tablas de Delta Lake también admiten todas las funciones de BigLake cuando las configuras como tablas de BigLake.

Antes de empezar

  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. Asegúrate de tener un conjunto de datos de BigQuery.

  6. Asegúrate de que tu versión del SDK de Google Cloud sea la 366.0.0 o una posterior:

    gcloud version
    

    Si es necesario, actualiza el SDK de Google Cloud.

  7. Crea una conexión de recursos de Cloud basada en tu fuente de datos externa y concede a esa conexión acceso a Cloud Storage. Si no tiene los permisos adecuados para crear una conexión, pida a su administrador de BigQuery que cree una conexión y la comparta con usted.

  8. Roles obligatorios

    Para crear una tabla Delta Lake, se necesitan los siguientes permisos:

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

    El rol predefinido Administrador de BigQuery (roles/bigquery.admin) de gestión de identidades y accesos incluye estos permisos.

    Si no eres un principal con este rol, pide a tu administrador que te conceda estos permisos o que cree la tabla Delta Lake por ti.

    Además, para permitir que los usuarios de BigQuery consulten la tabla, la cuenta de servicio asociada a la conexión debe tener los siguientes permisos y acceso:

    • Rol Lector de BigQuery (roles/bigquery.viewer)
    • Rol Usuario de conexión de BigQuery (roles/bigquery.connectionUser)
    • Acceso al segmento de Cloud Storage que contiene esos datos

    Para obtener más información sobre los roles y permisos de gestión de identidades y accesos en BigQuery, consulta el artículo sobre funciones y permisos predefinidos.

    Crear tablas con Delta Lake

    Para crear tablas de Delta Lake, sigue estos pasos.

    SQL

    Usa la declaración CREATE EXTERNAL TABLE para crear la tabla 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']);
    

    Sustituye los siguientes valores:

    • PROJECT_ID: el ID del proyecto en el que quieres crear la tabla Delta Lake.
    • DATASET: el conjunto de datos de BigQuery que contendrá la tabla de Delta Lake
    • DELTALAKE_TABLE_NAME: el nombre de tu tabla Delta Lake
    • REGION: la región que contiene la conexión para crear la tabla Delta Lake. Por ejemplo, us.
    • CONNECTION_ID: el ID de conexión (por ejemplo, myconnection)

      Cuando consultas los detalles de la conexión en la consola de Google Cloud , el ID de conexión es el valor de la última sección del ID de conexión completo que se muestra en ID de conexión. Por ejemplo, projects/myproject/locations/connection_location/connections/myconnection.

    • DELTA_TABLE_GCS_BASE_PATH: el prefijo de la tabla Delta Lake

    bq

    En un entorno de línea de comandos, usa el comando bq mk para crear la tabla Delta Lake:

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

    Sustituye los siguientes valores:

    • DEFINITION_FILE: la ruta a un archivo de definición de tabla
    • PROJECT_ID: el ID del proyecto en el que quieres crear la tabla Delta Lake.
    • DATASET: el conjunto de datos de BigQuery que contendrá la tabla de Delta Lake
    • DELTALAKE_TABLE_NAME: el nombre de tu tabla Delta Lake

    REST

    Usa la API BigQuery para crear una tabla Delta Lake llamando al método de 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
    

    Sustituye los siguientes valores:

    • PROJECT_ID: el ID del proyecto en el que quieres crear la tabla Delta Lake.
    • REGION: la región que contiene la conexión para crear la tabla Delta Lake. Por ejemplo, us.
    • CONNECTION_ID: el ID de conexión (por ejemplo, myconnection)

      Cuando consultas los detalles de la conexión en la consola de Google Cloud , el ID de conexión es el valor de la última sección del ID de conexión completo que se muestra en ID de conexión. Por ejemplo, projects/myproject/locations/connection_location/connections/myconnection.

    • DELTA_TABLE_GCS_BASE_PATH: el prefijo de la tabla Delta Lake

    • DELTALAKE_TABLE_NAME: el nombre de tu tabla Delta Lake

    • DATASET: el conjunto de datos de BigQuery que contendrá la tabla de Delta Lake

    Cuando creas tablas de Delta Lake, el prefijo de Delta Lake se usa como URI de la tabla. Por ejemplo, en una tabla que tiene registros en el contenedor gs://bucket/warehouse/basictable/_delta_log, el URI de la tabla es gs://bucket/warehouse/basictable. Cuando ejecutas consultas en la tabla de Delta Lake, BigQuery lee los datos del prefijo para identificar la versión actual de la tabla y, a continuación, calcula los metadatos y los archivos de la tabla.

    Aunque puedes crear tablas externas de Delta Lake sin conexión, no es recomendable por los siguientes motivos:

    • Los usuarios pueden experimentar errores ACCESS_DENIED al intentar acceder a archivos en Cloud Storage.
    • Las funciones como el control de acceso pormenorizado solo están disponibles en las tablas de BigLake de Delta Lake.

    Actualizar tablas de Delta Lake

    Para actualizar (actualizar) el esquema de las tablas de Delta Lake, sigue estos pasos.

    bq

    En un entorno de línea de comandos, usa el comando bq update para actualizar (actualizar) el esquema de la tabla Delta Lake:

    bq update --autodetect_schema PROJECT_ID:DATASET.DELTALAKE_TABLE_NAME
    

    Sustituye los siguientes valores:

    • PROJECT_ID: el ID del proyecto en el que quieres crear la tabla Delta Lake.
    • DATASET: el conjunto de datos de BigQuery que contendrá la tabla de Delta Lake
    • DELTALAKE_TABLE_NAME: el nombre de tu tabla Delta Lake

    REST

    Usa la API de BigQuery para actualizar una tabla Delta Lake llamando al método de 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
    

    Sustituye los siguientes valores:

    • DELTA_TABLE_GCS_BASE_PATH: el prefijo de la tabla Delta Lake
    • PROJECT_ID: el ID del proyecto en el que quieres crear la tabla Delta Lake.
    • REGION: la región que contiene la conexión para crear la tabla Delta Lake. Por ejemplo, us.
    • CONNECTION_ID: el ID de conexión (por ejemplo, myconnection)

      Cuando consultas los detalles de la conexión en la consola de Google Cloud , el ID de conexión es el valor de la última sección del ID de conexión completo que se muestra en ID de conexión. Por ejemplo, projects/myproject/locations/connection_location/connections/myconnection.

    • DELTALAKE_TABLE_NAME: el nombre de tu tabla Delta Lake

    • DATASET: el conjunto de datos de BigQuery que contendrá la tabla de Delta Lake

    Consultar tablas de Delta Lake

    Después de crear una tabla de BigLake de Delta Lake, puedes consultarla con la sintaxis de GoogleSQL, igual que harías con una tabla estándar de BigQuery. Por ejemplo:

    SELECT field1, field2 FROM mydataset.my_cloud_storage_table;
    

    Para obtener más información, consulta Consultar datos de Cloud Storage en tablas de BigLake.

    Se usa una conexión externa asociada a una cuenta de servicio para conectarse al almacén de datos. Como la cuenta de servicio recupera datos del almacén de datos, los usuarios solo necesitan acceso a la tabla Delta Lake.

    Asignación de datos

    BigQuery convierte los tipos de datos de Delta Lake a tipos de datos de BigQuery, tal como se muestra en la siguiente tabla:

    Tipo de Delta Lake Tipo de BigQuery
    boolean BOOL
    byte INT64
    int INT64
    long INT64
    float FLOAT64
    double FLOAT64
    Decimal(P/S) NUMERIC o BIG_NUMERIC, según la precisión
    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>>

    Limitaciones

    Las tablas de Delta Lake tienen las limitaciones de las tablas de BigLake y las siguientes:

    • Admite la versión de lectura 3 de Delta Lake con vectores de eliminación de rutas relativas y asignación de columnas.
    • No admite puntos de control de Delta Lake V2.
    • Debe indicar la versión del lector en el último archivo de entrada de registro. Por ejemplo, las tablas nuevas deben incluir 00000..0.json.
    • No se admiten las operaciones de captura de datos de cambios (CDC). Se ignorarán las operaciones de CDC que ya existan.
    • El esquema se detecta automáticamente. No se admite la modificación del esquema mediante BigQuery.
    • Los nombres de las columnas de la tabla deben cumplir las restricciones de nombres de columnas de BigQuery.
    • No se admiten vistas materializadas.
    • La API Read no es compatible con Delta Lake.

    Solución de problemas

    En esta sección se ofrece ayuda sobre las tablas de BigLake de Delta Lake. Para obtener ayuda más general sobre cómo solucionar problemas con las consultas de BigQuery, consulta el artículo Solucionar problemas con las consultas.

    Tiempo de espera de las consultas y errores de recursos

    Consulta el directorio de registros (gs://bucket/warehouse/basictable/_delta_log) de la tabla Delta Lake y busca archivos JSON con un número de versión superior al del punto de control anterior. Puedes obtener el número de versión consultando el directorio o inspeccionando el archivo _delta_log/_last_checkpoint. Los archivos JSON de más de 10 MiB pueden ralentizar la expansión de las tablas, lo que puede provocar problemas de tiempo de espera y de recursos. Para resolver este problema, usa el siguiente comando para crear un nuevo punto de control de forma que las consultas omitan la lectura de los archivos JSON:

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

    Los usuarios pueden usar el mismo comando para restablecer el intervalo de puntos de control al valor predeterminado de 10 o a un valor que evite que haya más de 50 MB de archivos JSON entre puntos de control.

    Nombre de columna no válido

    Asegúrate de que la asignación de columnas esté activada en la tabla Delta Lake. La asignación de columnas es compatible con Reader 2 o versiones posteriores. En Reader versión 1, define "delta.columnMapping.mode" como "name" con el siguiente comando:

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

    Si el nombre de columna no válido cumple las restricciones de los nombres de columna flexibles, ponte en contacto con Asistencia de Cloud o con biglake-help@google.com.

    Errores de acceso denegado

    Para diagnosticar problemas con las tablas de BigLake de Delta Lake, comprueba lo siguiente:

    Rendimiento

    Para mejorar el rendimiento de las consultas, prueba estos pasos:

    • Usa las utilidades de Delta Lake para compactar los archivos de datos subyacentes y eliminar los archivos redundantes, como los datos y los metadatos.

    • Asegúrate de que delta.checkpoint.writeStatsAsStruct esté configurado como true.

    • Asegúrate de que las variables que se usan con frecuencia en las cláusulas de predicado estén en las columnas de partición.

    Los conjuntos de datos grandes (más de 100 TB) pueden beneficiarse de configuraciones y funciones adicionales. Si los pasos anteriores no resuelven tus problemas, te recomendamos que te pongas en contacto con el servicio de atención al cliente o con biglake-help@google.com, sobre todo si los conjuntos de datos tienen un tamaño superior a 100 TB.