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 etINSERT INTO ... SELECT
depuis la table intermédiaire ouDROP
la table d'origine etRENAME
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.