Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Clone una tabla de Delta Lake o Apache Iceberg con el comando CLONE para crear una copia independiente de una versión específica. Los clones profundos copian los datos y los metadatos. Los clones poco profundos solo copian los metadatos y hacen referencia a los archivos de datos de origen, con menos proceso y almacenamiento que los clones profundos.
Azure Databricks también admite la clonación de tablas Parquet y Apache Iceberg. Consulte Clonar de forma incremental tablas Parquet y Apache Iceberg en Delta Lake y Clonar una tabla Iceberg administrada.
Para más detalles sobre el uso de clones con Unity Catalog, consulte Clonación superficial para tablas de Unity Catalog.
Note
Databricks recomienda usar OpenSharing para proporcionar acceso de solo lectura a las tablas en distintas organizaciones. Consulte ¿Qué es OpenSharing?.
Tipos de clon
Los siguientes tipos de clonación están disponibles:
| Tipo | Sintaxis SQL | Description |
|---|---|---|
| Clonación profunda |
CLONE o DEEP CLONE |
Copia tanto los datos como los metadatos de la tabla de origen a la tabla clonada de destino, incluidos los metadatos del flujo. Un flujo que escribe en la tabla de origen se puede detener y reanudar en el destino clonado desde el punto en que se detuvo. |
| Clon superficial | SHALLOW CLONE |
Copia solo los metadatos de la tabla de origen al destino de clonación. Los archivos de datos no se copian. Los clones poco profundos son más baratos de crear, ya que la operación usa menos recursos de proceso y espacio de almacenamiento. |
Los metadatos clonados incluyen: esquema, información de creación de particiones, invariables, nulabilidad y TBLPROPERTIES. Solo para clones profundos, también se clonan los metadatos del flujo y COPY INTO. Los metadatos no clonados son la descripción de la tabla, los metadatos de confirmación definidos por el usuario, el historial de tablas de Delta Lake y las propiedades del catálogo de Unity, como etiquetas.
Note
Las tablas de transmisión en tiempo real y las vistas materializadas no son compatibles con CLONE. No se puede usar una tabla de streaming ni una vista materializada como origen o destino de un clon profundo o superficial. Consulte Limitaciones y limitaciones.
Métricas de clonación
CLONE informa de las métricas siguientes como un dataframe de una sola fila una vez completada la operación:
-
source_table_size: tamaño de la tabla de origen que se va a clonar en bytes. -
source_num_of_files: número de archivos de la tabla de origen. -
num_removed_files: si se va a reemplazar la tabla, cuántos archivos se han quitado de la tabla actual. -
num_copied_files: número de archivos que se copiaron del origen (0 para clones superficiales). -
removed_files_size: tamaño en bytes de los archivos que se van a quitar de la tabla actual. -
copied_files_size: tamaño en bytes de los archivos copiados en la tabla.
Permisos
Debe configurar permisos para el control de acceso a tablas de Azure Databricks, así como para su proveedor de servicios en la nube.
Control de acceso a tabla
Los siguientes permisos son necesarios para clones profundos y superficiales:
- Permiso
SELECTen la tabla de origen. - Si usa
CLONEpara crear una nueva tabla, necesita tener permisoCREATEen la base de datos en la que está creando la tabla. - Si está utilizando
CLONEpara reemplazar una tabla, debe tener el permisoMODIFYen la tabla.
Permisos del proveedor de nube
Los lectores de un clon profundo necesitan acceso de lectura al directorio del clon. Los redactores necesitan permiso de escritura en el directorio del clon.
Los lectores de un clon superficial necesitan acceso de lectura tanto a los archivos de datos de la tabla de origen como al directorio del clon, ya que los archivos de datos permanecen en el origen. Los redactores necesitan permiso de escritura en el directorio del clon.
Examples
Crear clones profundos o superficiales
En los ejemplos de código siguientes se muestra cómo crear clones profundos y superficiales:
SQL
Cree un clon profundo:
CREATE TABLE target_table CLONE source_table;
Reemplazar un destino existente:
CREATE OR REPLACE TABLE target_table CLONE source_table;
Cree un clon profundo o omita si el destino ya existe:
CREATE TABLE IF NOT EXISTS target_table CLONE source_table;
Cree un clon superficial de la versión más reciente, de una versión específica o con una marca temporal específica. La marca de tiempo puede ser una cadena de fecha como '2019-01-01' o una expresión como date_sub(current_date(), 1).
CREATE TABLE target_table SHALLOW CLONE source_table;
CREATE TABLE target_table SHALLOW CLONE source_table VERSION AS OF version;
CREATE TABLE target_table SHALLOW CLONE source_table TIMESTAMP AS OF timestamp_expression;
Python
La API de Python DeltaTable es específica de Delta Lake.
Clona el código fuente en su última versión:
from delta.tables import *
deltaTable = DeltaTable.forName(spark, "source_table")
deltaTable.clone(target="target_table", isShallow=True, replace=False)
Clonar el código fuente en una versión específica:
deltaTable.cloneAtVersion(version=1, target="target_table", isShallow=True, replace=False)
Clona el origen en una marca temporal específica:
deltaTable.cloneAtTimestamp(timestamp="2019-01-01", target="target_table", isShallow=True, replace=False)
Scala
La API de Scala DeltaTable es específica de Delta Lake.
Clona el código fuente en su última versión:
import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "source_table")
deltaTable.clone(target="target_table", isShallow=true, replace=false)
Clonar el código fuente en una versión específica:
deltaTable.cloneAtVersion(version=1, target="target_table", isShallow=true, replace=false)
Clona el origen en una marca temporal específica:
deltaTable.cloneAtTimestamp(timestamp="2019-01-01", target="target_table", isShallow=true, replace=false)
Para obtener más información sobre la sintaxis, consulte CREATE TABLE CLONE.
Comprobación de los metadatos copiados durante CLONE
En este ejemplo se muestran los metadatos que se copian y cuáles no durante las operaciones CLONE, en concreto TBLPROPERTIES, las etiquetas de Unity Catalog y el historial de Delta Lake.
Cree una tabla de origen con una propiedad personalizada y una duración de retención de registros no predeterminada y, a continuación, inserte datos para generar el historial de tablas:
CREATE OR REPLACE TABLE test_clone_source (id INT, val STRING)
TBLPROPERTIES ('my.custom.prop' = 'hello', 'delta.logRetentionDuration' = '12 days');
ALTER TABLE test_clone_source SET TAGS ('team' = 'data-eng', 'env' = 'prod');
INSERT INTO test_clone_source VALUES (1, 'a');
INSERT INTO test_clone_source VALUES (2, 'b');
Cree un clon profundo y un clon superficial:
CREATE OR REPLACE TABLE test_clone_deep DEEP CLONE test_clone_source;
CREATE TABLE test_clone_shallow SHALLOW CLONE test_clone_source;
Note
En Unity Catalog, no se puede usar CREATE OR REPLACE para sobrescribir un clon superficial existente. Use DROP TABLE seguido de CREATE TABLEo use un nuevo nombre de tabla. Consulte Limitaciones.
Confirme que TBLPROPERTIES se hayan copiado en ambos clones:
SHOW TBLPROPERTIES test_clone_source;
SHOW TBLPROPERTIES test_clone_deep;
SHOW TBLPROPERTIES test_clone_shallow;
Confirme que las etiquetas de Unity Catalog no se copian a los clones:
SELECT catalog_name, schema_name, table_name, tag_name, tag_value FROM information_schema.table_tags WHERE table_name = 'test_clone_source';
SELECT catalog_name, schema_name, table_name, tag_name, tag_value FROM information_schema.table_tags WHERE table_name = 'test_clone_deep';
SELECT catalog_name, schema_name, table_name, tag_name, tag_value FROM information_schema.table_tags WHERE table_name = 'test_clone_shallow';
Confirme que el historial de Delta Lake no se copia a los clones:
DESCRIBE HISTORY test_clone_source;
DESCRIBE HISTORY test_clone_deep;
DESCRIBE HISTORY test_clone_shallow;
Limpiar:
DROP TABLE IF EXISTS test_clone_shallow;
DROP TABLE IF EXISTS test_clone_source;
DROP TABLE IF EXISTS test_clone_deep;
Archivado de datos
Puede crear un clon profundo para conservar el estado de una tabla en un momento dado a fin de archivarla. Puede sincronizar clones profundos de forma incremental para mantener un estado actualizado de una tabla de origen para la recuperación ante desastres.
Ejecute el siguiente comando una vez al mes para sincronizar el archivo:
CREATE OR REPLACE TABLE archive_table CLONE my_prod_table
La reproducción de modelos de aprendizaje automático
En el caso de los casos de uso de aprendizaje automático, es posible que desee archivar una versión de una tabla que se usó para entrenar un modelo de MACHINE Learning. Los modelos futuros se pueden probar mediante este conjunto de datos archivado. Para archivar una versión del conjunto de datos con CLONE, haga lo siguiente:
Por ejemplo, para archivar la versión de una tabla usada para entrenar un modelo en la versión 15:
CREATE TABLE model_dataset CLONE entire_dataset VERSION AS OF 15
Experimentos a corto plazo en una mesa de producción
Para probar un flujo de trabajo en una tabla de producción sin dañar la tabla, cree un clon superficial. Los clones superficiales permiten ejecutar cargas de trabajo en la tabla clonada, que hace referencia a todos los datos de producción, pero no afectan a las cargas de trabajo de producción.
Cree un clon superficial de la tabla de producción:
CREATE TABLE my_test SHALLOW CLONE my_prod_table;
Note
En Unity Catalog, no se puede usar CREATE OR REPLACE para sobrescribir un clon superficial existente. Use DROP TABLE seguido de CREATE TABLEo use un nuevo nombre de tabla. Consulte Limitaciones.
Ejecute actualizaciones y validaciones en el clon:
UPDATE my_test WHERE user_id is null SET invalid=true;
Cuando esté listo, vuelva a fusionar los cambios. La combinación usa información de actualización en el clon para eliminar solo los archivos modificados siempre que sea posible:
MERGE INTO my_prod_table
USING my_test
ON my_test.user_id <=> my_prod_table.user_id
WHEN MATCHED AND my_test.user_id is null THEN UPDATE *;
Elimine el clon al terminar:
DROP TABLE my_test;
Invalidar las propiedades de la tabla
Las anulaciones de las propiedades de la tabla son útiles para:
- Anotar tablas con información de propietario o usuario al compartir datos con diferentes unidades de negocio.
- Archivar tablas de Delta Lake cuando se requiere viaje en el tiempo sobre los datos archivados. Puede especificar los períodos de retención de datos y registros de forma independiente para la tabla de archivo. Por ejemplo:
SQL
Para una tabla de Delta Lake:
CREATE OR REPLACE TABLE archive_table CLONE prod.my_table
TBLPROPERTIES (
delta.logRetentionDuration = '3650 days',
delta.deletedFileRetentionDuration = '3650 days'
)
Para una tabla de Iceberg:
CREATE OR REPLACE TABLE archive_table CLONE prod.my_table
TBLPROPERTIES (
iceberg.logRetentionDuration = '3650 days',
iceberg.deletedFileRetentionDuration = '3650 days'
)
Python
La API deltaTable de Python es específica de Delta Lake.
dt = DeltaTable.forName(spark, "prod.my_table")
tblProps = {
"delta.logRetentionDuration": "3650 days",
"delta.deletedFileRetentionDuration": "3650 days"
}
dt.clone(target="archive_table", isShallow=False, replace=True, tblProps)
Scala
La API DeltaTable de Scala es específica de Delta Lake.
val dt = DeltaTable.forName(spark, "prod.my_table")
val tblProps = Map(
"delta.logRetentionDuration" -> "3650 days",
"delta.deletedFileRetentionDuration" -> "3650 days"
)
dt.clone(target="archive_table", isShallow = false, replace = true, properties = tblProps)
Comportamiento de la operación de clonación para el metastore de Hive heredado
Important
En Databricks Runtime 13.3 LTS y versiones posteriores, las tablas administradas de Unity Catalog admiten clones poco profundos. El comportamiento de clonación para las tablas del catálogo de Unity difiere del comportamiento de clonación en otros entornos. Consulte Clonación superficial para tablas de Unity Catalog.
Para una tabla de Delta Lake registrada en el metastore de Hive o en una colección de archivos no registrados como una tabla, el clon tiene los siguientes comportamientos:
- Los cambios realizados en clones profundos o superficiales no afectan a la tabla de origen.
- Los clones superficiales hacen referencia a archivos de datos en el directorio de origen. Si se ejecuta
VACUUMen la tabla de origen, los clientes ya no pueden leer esos archivos de datos y esto genera unFileNotFoundException. Para repararlo, ejecute clone conreplaceen el clon superficial. Si esto sucede a menudo, considere la posibilidad de usar un clon profundo, que no depende de la tabla de origen. - Los clones profundos no dependen de la tabla de origen, pero son costosos de crear porque copian los datos y los metadatos.
- Clonar con
replaceen un destino que ya tiene una tabla en esa ruta crea un registro de Delta si no existe. EjecuteVACUUMpara limpiar los datos existentes. - Para las tablas existentes de Delta Lake, la clonación crea un nuevo commit incremental que incluye solo los metadatos nuevos y los datos de la tabla de origen desde la última clonación.
- La clonación de una tabla difiere de
Create Table As Select(CTAS). Un clon copia los metadatos de la tabla de origen además de los datos. No es necesario especificar particiones, formatos, invariables, nulabilidad u otros valores. - Una tabla clonada tiene un historial independiente de su tabla de origen. Las consultas de viaje de tiempo en una tabla clonada no funcionan con las mismas entradas que en la tabla de origen.