El problema está en tu código. Debido a que sobrescribe una tabla desde la que está tratando de leer, borra efectivamente todos los datos antes de que Spark pueda acceder a ellos.
Recuerda que Spark es perezoso. Cuando creas un Dataset
Spark obtiene los metadatos necesarios, pero no carga los datos. Por lo tanto, no existe un caché mágico que conserve el contenido original. Los datos se cargarán cuando realmente se requieran. Aquí está cuando ejecutas write
acción y cuando comienza a escribir no hay más datos para recuperar.
Lo que necesitas es algo como esto:
- Crear un
Dataset
. -
Aplique las transformaciones requeridas y escriba datos en una tabla MySQL intermedia.
-
TRUNCATE
la entrada original yINSERT INTO ... SELECT
desde la tabla intermedia oDROP
la tabla original yRENAME
mesa intermedia.
Un enfoque alternativo, pero menos favorable, sería:
- Crear un
Dataset
. - Aplicar las transformaciones requeridas y escribir datos en una tabla Spark persistente (
df.write.saveAsTable(...)
o equivalente) TRUNCATE
la entrada original.- Lea los datos y guárdelos (
spark.table(...).write.jdbc(...)
) - Mesa Drop Spark.
No podemos enfatizar lo suficiente que usar Spark cache
/ persist
no es el camino a seguir. Incluso con el conservador StorageLevel
(MEMORY_AND_DISK_2
/ MEMORY_AND_DISK_SER_2
) los datos almacenados en caché se pueden perder (fallas de nodo), lo que lleva a errores de corrección silenciosos.