Crea tablas externas de BigLake para Delta Lake

BigLake te permite acceder a las tablas de Delta Lake con un control de acceso más detallado. 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 las tablas de Delta Lake:

  • Delegación de acceso: Consulta datos estructurados en almacenes de datos externos con delegación de acceso. La delegación de acceso separa el acceso a la tabla de Delta Lake del acceso al almacén de datos subyacente.
  • Control de acceso detallado: Aplica la seguridad detallada a nivel de tabla, lo que incluye seguridad de nivel de fila y nivel de columna. Para las tablas de Delta Lake basadas en Cloud Storage, también puedes usar el enmascaramiento de datos dinámicos.
  • Evolución del esquema: Los cambios en el esquema en las tablas de Delta Lake se detectan de forma automática. 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 comenzar

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

    Go to project selector

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

  3. Enable the BigQuery Connection and BigQuery Reservation APIs.

    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 366.0.0 o posterior:

    gcloud version
    

    Si es necesario, actualiza el SDK de Google Cloud.

  7. Crea una conexión de recursos de Cloud según tu fuente de datos externa y otórgale acceso a Cloud Storage. Si no tienes los permisos adecuados para crear una conexión, pídele a tu administrador de BigQuery que cree una conexión y la comparta contigo.

Roles obligatorios

Se requieren los siguientes permisos para crear una tabla de Delta Lake:

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

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

Si no eres principal en este rol, pídele a tu administrador que te otorgue estos permisos o que cree la tabla de Delta Lake por ti.

Además, para permitir que los usuarios de BigQuery consulten la tabla, la cuenta de servicio asociada con la conexión debe tener el siguiente permiso y acceso:

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

Para obtener más información sobre los roles y los permisos de la administración de identidades y accesos en BigQuery, consulta Funciones y permisos predefinidos.

Crea 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 de 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']);

Reemplaza los siguientes valores:

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

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

  • DELTA_TABLE_GCS_BASE_PATH: Es el prefijo de la tabla de Delta Lake.

bq

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

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

Reemplaza los siguientes valores:

  • DEFINITION_FILE: la ruta de acceso al archivo de definición de tablas.
  • PROJECT_ID: Es el ID del proyecto en el que deseas crear la tabla de Delta Lake.
  • DATASET: Es el conjunto de datos de BigQuery que contiene la tabla de Delta Lake.
  • DELTALAKE_TABLE_NAME: Es el nombre de tu tabla de Delta Lake.

REST

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

Reemplaza los siguientes valores:

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

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

  • DELTA_TABLE_GCS_BASE_PATH: Es el prefijo de la tabla de Delta Lake.

  • DELTALAKE_TABLE_NAME: Es el nombre de tu tabla de Delta Lake.

  • DATASET: Es el conjunto de datos de BigQuery que contiene la tabla de Delta Lake.

Cuando creas tablas de Delta Lake, el prefijo de Delta Lake se usa como el URI de la tabla. Por ejemplo, para una tabla que tiene registros en el bucket 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 con el prefijo para identificar la versión actual de la tabla y, luego, calcula los metadatos y los archivos de la tabla.

Aunque puedes crear tablas externas de Delta Lake sin una conexión, no se recomienda por los siguientes motivos:

  • Es posible que los usuarios experimenten errores ACCESS_DENIED cuando intenten acceder a archivos en Cloud Storage.
  • Las funciones como el control de acceso detallado solo están disponibles en las tablas de BigLake de Delta Lake.

Actualiza las 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 de Delta Lake:

bq update --autodetect_schema PROJECT_ID:DATASET.DELTALAKE_TABLE_NAME

Reemplaza los siguientes valores:

  • PROJECT_ID: Es el ID del proyecto en el que deseas crear la tabla de Delta Lake.
  • DATASET: Es el conjunto de datos de BigQuery que contiene la tabla de Delta Lake.
  • DELTALAKE_TABLE_NAME: Es el nombre de tu tabla de Delta Lake.

REST

Usa la API de BigQuery para actualizar una tabla de Delta Lake llamando al método de la API tables.patch:

REQUEST='{
  "externalDataConfiguration": {
    "sourceFormat": "DELTA_LAKE",
    "sourceUris": [
      "DELTA_TABLE_GCS_BASE_PATH"
    ],
    "connectionId": "PROJECT_ID.REGION.CONNECTION_ID",
    "autodetect": true
  },
  "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

Reemplaza los siguientes valores:

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

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

  • DELTALAKE_TABLE_NAME: Es el nombre de tu tabla de Delta Lake.

  • DATASET: Es el conjunto de datos de BigQuery que contiene la tabla de Delta Lake.

Consulta tablas de Delta Lake

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

SELECT field1, field2 FROM mydataset.my_cloud_storage_table;

Para obtener más información, ve a Consulta datos de Cloud Storage en tablas de BigLake.

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

Asignación de datos

BigQuery convierte los tipos de datos de Delta Lake en tipos de datos de BigQuery, 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 limitaciones de tablas de BigLake y también las siguientes limitaciones:

  • Admite la versión del lector 3 de Delta Lake con vectores de eliminación y asignación de columnas.
  • No admite puntos de control de Delta Lake V2.
  • Debes enumerar 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 operaciones de captura de datos modificados (CDC). Se ignoran todas las operaciones de los CDC existentes.
  • El esquema se detecta de forma automática. No se admite modificar el esquema con BigQuery.
  • Los nombres de las columnas de la tabla deben cumplir con las restricciones de nombres de columnas de BigQuery.
  • No se admiten las vistas materializadas.
  • La API de Read no es compatible con Delta Lake.

Soluciona problemas

En esta sección, se proporciona ayuda con las tablas de BigLake de Delta Lake. Si necesitas ayuda más general para solucionar problemas de consultas de BigQuery, consulta Cómo solucionar problemas de consulta.

Tiempo de espera de la consulta y errores de recursos

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

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

Luego, 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 tener más de 50 MB de archivos JSON entre los puntos de control.

Nombre de columna no válido

Asegúrate de que el mapeo de columnas esté activado para la tabla de Delta Lake. La asignación de columnas es compatible con la versión 2 de Reader o versiones posteriores. Para la versión 1 de Reader, establece "delta.columnMapping.mode" en "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 la columna no válido cumple con las restricciones de nombres de columnas flexibles, comunícate con Atención al cliente de Cloud o escribe a biglake-help@google.com.

Errores de acceso denegado

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

Rendimiento

Para mejorar el rendimiento de las consultas, prueba los siguientes pasos:

  • Usa las utilidades de Delta Lake para compactar los archivos de datos subyacentes y quitar 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 columnas de partición.

Los conjuntos de datos grandes (más de 100 TB) podrían beneficiarse de configuraciones y funciones adicionales. Si los pasos anteriores no resuelven tus problemas, considera comunicarte con el equipo de atención al cliente o con biglake-help@google.com, en especial para conjuntos de datos de más de 100 TB.