Sobrescritura de datos de forma selectiva con Delta Lake

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 USING clá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 overwriteSchema a true.
  • No puede especificar ambos partitionOverwriteMode y replaceWhere en la misma operación DataFrameWriter.
  • Si especifica una replaceWhere condición mediante una DataFrameWriter opción, Delta Lake aplica esa condición para controlar qué datos se sobrescriben. Esta opción tiene prioridad sobre la partitionOverwriteMode configuració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.