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.
Delta Lake tiene las siguientes opciones distintas para sobrescrituras selectivas:
| Opción | Caso de uso | Tipos de cómputo compatibles | Versión mínima |
|---|---|---|---|
REPLACE WHERE |
Sobrescribir de forma atómica las filas que coinciden con un predicado. Use para reemplazos con una condición de coincidencia fija, como colA = 5 o int_col IN (1, 2, 3). |
Todos los tipos de cómputo. | SQL en Databricks Runtime 12.2 LTS y versiones posteriores. Python y Scala en Databricks Runtime 9.1 LTS y versiones posteriores. |
REPLACE USING |
Sobrescritura de datos dinámicos. Reemplaza todas las filas que coinciden con las columnas especificadas, en función de la comparación de igualdad de los valores de columna, en el conjunto de datos proporcionado. | Todos los tipos de computación. | SQL en Databricks Runtime 16.3 y versiones posteriores. Python y Scala en Databricks Runtime 18.2 y versiones posteriores. |
REPLACE ON |
Los datos dinámicos se sobrescriben mediante una expresión booleana. Úselo para realizar sustituciones con una condición de coincidencia compleja o segura ante NULL, como s.colA <=> t.colA AND s.colB <=> t.colB. |
Todos los tipos de computación. | SQL en Databricks Runtime 17.1 y versiones posteriores. Python y Scala en Databricks Runtime 18.2 y versiones posteriores. |
partitionOverwriteMode |
Sobrescritura heredada de particiones dinámicas, que sobrescribe todos los datos existentes en cada partición en la que la operación de escritura confirme nuevos datos. No se recomienda para las nuevas cargas de trabajo. | SQL solo admite proceso clásico. Python y Scala admiten todos los tipos de proceso. | SQL, Python y Scala en Databricks Runtime 11.3 LTS y versiones posteriores. |
Para la mayoría de los casos de uso, Databricks recomienda usar REPLACE USING o REPLACE WHERE. Utilice REPLACE ON solo si su caso de uso requiere condiciones de coincidencia complejas o compatibles con NULL.
Para obtener más información sobre el comportamiento de reemplazo de cada opción, consulte INSERT. Para obtener una lista completa de las opciones de DataFrameWriter Delta Lake, consulte Delta Lake y Apache Iceberg.
En Scala y Python, replaceOn y replaceUsing no se pueden usar en combinación con replaceWhere, partitionOverwriteMode o overwriteSchema.
Para las consultas de origen vacías, tanto REPLACE USING como REPLACE ON no eliminan datos; sin embargo, REPLACE WHERE podría eliminar datos.
Important
Si los datos se han sobrescrito accidentalmente, puede usar la restauración para deshacer el cambio.
REPLACE WHERE
Solo puede sobrescribir de forma selectiva los datos que coinciden con una expresión arbitraria con REPLACE WHERE.
Important
Para aprovechar la actualización incremental al ejecutar REPLACE WHERE, use flujos de tipo REPLACE WHERE en pipelines declarativos de Spark (SDP). Consulte Procesamiento por lotes con flujos REPLACEWHERE.
Para reemplazar de forma atómica los eventos de enero en la tabla de destino, particionada por start_date, con los datos de replace_data:
Python
(replace_data.write
.mode("overwrite")
.option("replaceWhere", "start_date >= '2017-01-01' AND end_date <= '2017-01-31'")
.saveAsTable("events")
)
Scala
replace_data.write
.mode("overwrite")
.option("replaceWhere", "start_date >= '2017-01-01' AND end_date <= '2017-01-31'")
.saveAsTable("events")
SQL
INSERT INTO TABLE events REPLACE WHERE start_date >= '2017-01-01' AND end_date <= '2017-01-31' SELECT * FROM replace_data
Este código de ejemplo escribe los datos en replace_data, valida que todas las filas coincidan con el predicado y realiza un reemplazo atómico mediante semánticas overwrite. Si alguno de los valores de la operación se encuentra fuera del predicado, esta operación produce un error de forma predeterminada.
En el cómputo clásico, para cambiar este comportamiento a overwrite valores dentro del rango del predicado y insert registros fuera del rango especificado, quite la comprobación de restricciones estableciendo spark.databricks.delta.replaceWhere.constraintCheck.enabled en false:
Python
spark.conf.set("spark.databricks.delta.replaceWhere.constraintCheck.enabled", False)
Scala
spark.conf.set("spark.databricks.delta.replaceWhere.constraintCheck.enabled", false)
SQL
SET spark.databricks.delta.replaceWhere.constraintCheck.enabled=false
Note
REPLACE WHERE acepta un boolean_expression con algunas restricciones. Consulte INSERT en la referencia del lenguaje SQL.
En el caso de las consultas de origen vacías, REPLACE WHERE puede eliminar filas de tabla.
Comportamiento heredado
La versión heredada replaceWhere solo está disponible en el proceso clásico. Consulte Información general sobre el cómputo clásico.
Si utiliza el comportamiento heredado de replaceWhere, las consultas sobrescriben los datos que coinciden con un predicado solamente en las columnas de partición. El siguiente comando reemplazaría atómicamente el mes de enero en la tabla de destino, que particiona pordate, con los datos de df.
Python
(df.write
.mode("overwrite")
.option("replaceWhere", "birthDate >= '2017-01-01' AND birthDate <= '2017-01-31'")
.saveAsTable("people10m")
)
Scala
df.write
.mode("overwrite")
.option("replaceWhere", "birthDate >= '2017-01-01' AND birthDate <= '2017-01-31'")
.saveAsTable("people10m")
Para usar el comportamiento heredado, establezca spark.databricks.delta.replaceWhere.dataColumns.enabled en false:
Python
spark.conf.set("spark.databricks.delta.replaceWhere.dataColumns.enabled", False)
Scala
spark.conf.set("spark.databricks.delta.replaceWhere.dataColumns.enabled", false)
SQL
SET spark.databricks.delta.replaceWhere.dataColumns.enabled=false
Sobrescritura de datos dinámicos
Los datos dinámicos sobrescriben selectivamente los datos que coinciden con las columnas de clave especificadas o la expresión booleana, dejando sin cambios todos los demás datos. Se admiten tablas con particiones, tablas sin particiones y tablas con agrupación en clústeres líquidos.
Las sobrescrituras de particiones dinámicas son un subconjunto del comportamiento de sobrescritura de datos dinámicos. Las sobrescrituras dinámicas de particiones sustituyen todos los datos existentes en cada partición en la que la operación de escritura confirmará nuevos datos y dejan sin cambios todas las demás particiones. Solo se admiten las tablas particionadas.
REPLACE USING
SQL compatible con Databricks Runtime 16.3 y versiones posteriores. Python y Scala compatibles con Databricks Runtime 18.2 y versiones posteriores. Para conocer las diferencias de comportamiento en Databricks Runtime 16.3 a 17.1, consulte Comportamiento heredado.
REPLACE USING habilita un comportamiento de reescritura atómica independiente del procesamiento que funciona en almacenes de SQL de Databricks, procesamiento sin servidor y procesamiento clásico.
REPLACE USING no requiere que establezca una configuración de sesión de Spark.
REPLACE USING reemplaza las filas cuando las columnas especificadas son iguales según el criterio de igualdad. Todos los demás datos permanecen sin cambios.
Use la sobrescritura de datos dinámicos con REPLACE USING:
Python
(sourceDataDF.write
.mode("overwrite")
.option("replaceUsing", "event_id, start_date")
.saveAsTable("events")
)
Scala
sourceDataDF.write
.mode("overwrite")
.option("replaceUsing", "event_id, start_date")
.saveAsTable("events")
SQL
INSERT INTO TABLE events
REPLACE USING (event_id, start_date)
SELECT * FROM source_data
En el caso de las consultas de origen vacías, REPLACE USING no elimina ninguna fila de tabla.
En el caso de condiciones de coincidencia complejas o seguras para NULL, use REPLACE ON en su lugar. Consulte REPLACE ON.
Consulte INSERT en la referencia del lenguaje SQL.
Comportamiento heredado
En Databricks Runtime 16.3 a 17.1, REPLACE USING usa el comportamiento heredado y solo permite sobrescribir particiones dinámicas, mientras que Databricks Runtime 17.2 y versiones posteriores permite sobrescribir datos dinámicos.
Tenga en cuenta las siguientes restricciones y comportamientos para el REPLACE USING comportamiento heredado:
- Debe especificar el conjunto completo de columnas de partición de la tabla en la
USINGcláusula . - Valide siempre que los datos escritos solo toquen las particiones esperadas. Una única fila en la partición incorrecta puede sobrescribir de manera involuntaria toda la partición.
REPLACE ON
SQL compatible con Databricks Runtime 17.1 y versiones posteriores. Python y Scala compatibles con Databricks Runtime 18.2 y versiones posteriores.
REPLACE ON reemplaza las filas cuando coinciden con una condición definida por el usuario, a diferencia REPLACE USINGde , que reemplaza las filas cuando las columnas especificadas se comparan iguales con igualdad. Use REPLACE ON cuando necesite una lógica coincidente que REPLACE USING no admita, como tratar NULL los valores como iguales.
Opcionalmente, use la targetAlias opción para especificar un alias para la tabla de destino y las .as() API o .alias() para especificar un alias para los datos de origen.
Para ver la sintaxis de SQL, consulte INSERT.
Python
(sourceDataDF.alias("s")
.write
.mode("overwrite")
.option("targetAlias", "t")
.option("replaceOn", "s.event_id <=> t.event_id AND s.start_date <=> t.start_date")
.saveAsTable("events")
)
Scala
sourceDataDF.as("s")
.write
.mode("overwrite")
.option("targetAlias", "t")
.option("replaceOn", "s.event_id <=> t.event_id AND s.start_date <=> t.start_date")
.saveAsTable("events")
SQL
INSERT INTO TABLE events AS t
REPLACE ON (s.event_id <=> t.event_id AND s.start_date <=> t.start_date)
(SELECT * FROM source_data) AS s
En el caso de las consultas de origen vacías, REPLACE ON no elimina ninguna fila de tabla.
Sobrescrituras de particiones dinámicas con partitionOverwriteMode (heredado)
Important
Esta característica está en versión preliminar pública.
Databricks Runtime 11.3 LTS y versiones posteriores admite sobrescrituras de particiones dinámicas para tablas con particiones mediante el modo de sobrescritura: ya sea INSERT OVERWRITE en SQL o en una escritura de DataFrame con df.write.mode("overwrite"). Este tipo de sobrescritura solo está disponible para el proceso clásico, no para los almacenes de SQL de Databricks ni para el proceso sin servidor.
Advertencia
Cuando sea posible, use INSERT REPLACE USING en lugar de la sobrescritura de particiones con INSERT OVERWRITE PARTITION y spark.sql.sources.partitionOverwriteMode=dynamic. La sobrescritura de particiones puede usar datos obsoletos cuando hay cambios en la partición.
Para usar el modo de sobrescritura de particiones dinámicas, establezca la configuración spark.sql.sources.partitionOverwriteMode de sesión de Spark en dynamic. Como alternativa, puede establecer la DataFrameWriter opción partitionOverwriteMode en dynamic. Si está presente, la opción específica de la consulta invalida el modo definido en la configuración de sesión. El valor predeterminado de spark.sql.sources.partitionOverwriteMode es static.
En el ejemplo siguiente se usa partitionOverwriteMode:
SQL
SET spark.sql.sources.partitionOverwriteMode=dynamic;
INSERT OVERWRITE TABLE default.people10m SELECT * FROM morePeople;
Python
(df.write
.mode("overwrite")
.option("partitionOverwriteMode", "dynamic")
.saveAsTable("default.people10m")
)
Scala
df.write
.mode("overwrite")
.option("partitionOverwriteMode", "dynamic")
.saveAsTable("default.people10m")
Tenga en cuenta las siguientes restricciones y comportamientos para partitionOverwriteMode:
- No se puede establecer
overwriteSchemaatrue. - No puede especificar ambos
partitionOverwriteModeyreplaceWhereen la misma operaciónDataFrameWriter. - Si especifica una
replaceWherecondición mediante unaDataFrameWriteropción, Delta Lake aplica esa condición para controlar qué datos se sobrescriben. Esta opción tiene prioridad sobre lapartitionOverwriteModeconfiguración de nivel de sesión. - Valide siempre que los datos escritos solo toquen las particiones esperadas. Una única fila en la partición incorrecta puede sobrescribir de manera involuntaria toda la partición.