Mysql
 sql >> Base de données >  >> RDS >> Mysql

Spark SQL et MySQL- SaveMode.Overwrite n'insère pas les données modifiées

Le problème est dans votre code. Parce que vous écrasez une table à partir de laquelle vous essayez de lire, vous effacez efficacement toutes les données avant que Spark ne puisse y accéder.

Rappelez-vous que Spark est paresseux. Lorsque vous créez un Dataset Spark récupère les métadonnées requises, mais ne charge pas les données. Il n'y a donc pas de cache magique qui préservera le contenu original. Les données seront chargées lorsqu'elles seront réellement nécessaires. Le voici lorsque vous exécutez write action et lorsque vous commencez à écrire, il n'y a plus de données à récupérer.

Ce dont vous avez besoin est quelque chose comme ceci :

  • Créer un Dataset .
  • Appliquez les transformations requises et écrivez les données dans une table MySQL intermédiaire.

  • TRUNCATE l'entrée d'origine et INSERT INTO ... SELECT depuis la table intermédiaire ou DROP la table d'origine et RENAME table intermédiaire.

Une approche alternative, mais moins favorable, serait :

  • Créer un Dataset .
  • Appliquez les transformations requises et écrivez les données dans une table Spark persistante (df.write.saveAsTable(...) ou équivalent)
  • TRUNCATE l'entrée d'origine.
  • Lire les données et les enregistrer (spark.table(...).write.jdbc(...) )
  • Supprimer le tableau Spark.

Nous ne saurions trop insister sur le fait que l'utilisation de Spark cache / persist n'est pas la voie à suivre. Même avec le conservateur StorageLevel (MEMORY_AND_DISK_2 / MEMORY_AND_DISK_SER_2 ) les données mises en cache peuvent être perdues (échecs de nœud), entraînant des erreurs d'exactitude silencieuses.