Spark SQL y MySQL- SaveMode.Overwrite no insertando datos modificados

Tengo una tabla de test en MySQL con id y nombre como a continuación:

 +----+-------+ | id | name | +----+-------+ | 1 | Name1 | +----+-------+ | 2 | Name2 | +----+-------+ | 3 | Name3 | +----+-------+ 

Estoy usando Spark DataFrame para leer estos datos (usando JDBC) y modificar los datos como este

 Dataset modified = sparkSession.sql("select id, concat(name,' - new') as name from test"); modified.write().mode("overwrite").jdbc(AppProperties.MYSQL_CONNECTION_URL, "test", connectionProperties); 

Pero mi problema es que si doy el modo de sobrescritura, se descarta la tabla anterior y se crea una nueva tabla pero no se insertan datos.

Intenté el mismo progtwig leyendo un archivo csv (los mismos datos que la tabla de prueba) y sobrescribiendo. Eso funcionó para mí.

Me estoy perdiendo de algo ?

¡Gracias!

El problema está en tu código. Como sobreescribes una tabla desde la que intentas leer, borras todos los datos antes de que Spark pueda acceder a ellos.

Recuerda que Spark es flojo. Cuando crea un Dataset Spark recupera los metadatos requeridos, pero no carga los datos. Entonces no hay memoria mágica que preserve el contenido original. Los datos se cargarán cuando realmente se requiera. Aquí es cuando ejecuta la acción de write y cuando comienza a escribir no hay más datos para ser recuperados.

Lo que necesitas es algo como esto:

  • Crea un Dataset .
  • Aplique las transformaciones requeridas y escriba datos en una tabla MySQL intermedia.

  • TRUNCATE la entrada original e INSERT INTO ... SELECT de la tabla intermedia o DROP la tabla original y RENAME tabla intermedia.

Un enfoque alternativo, pero menos favorable, sería:

  • Crea un Dataset .
  • Aplicar las transformaciones requeridas y escribir datos en una tabla Spark persistente ( df.write.saveAsTable(...) o equivalente)
  • TRUNCATE la entrada original.
  • Lectura de datos y guardar ( spark.table(...).write.jdbc(...) )
  • Drop Spark table.