sql >> Base de Datos >  >> RDS >> Mysql

Spark SQL y MySQL- SaveMode.Overwrite sin insertar datos modificados

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 y INSERT INTO ... SELECT desde la tabla intermedia o DROP la tabla original y RENAME 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.