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.
-
TRUNCATEla entrada original yINSERT INTO ... SELECTdesde la tabla intermedia oDROPla tabla original yRENAMEmesa 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) TRUNCATEla 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.