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.
-
TRUNCATEl'entrée d'origine etINSERT INTO ... SELECTdepuis la table intermédiaire ouDROPla table d'origine etRENAMEtable 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) TRUNCATEl'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.