Het probleem zit in je code. Omdat u een tabel overschrijft waaruit u probeert te lezen, wist u effectief alle gegevens voordat Spark er daadwerkelijk toegang toe heeft.
Onthoud dat Spark lui is. Wanneer u een Dataset
aanmaakt Spark haalt vereiste metagegevens op, maar laadt de gegevens niet. Er is dus geen magische cache die de originele inhoud behoudt. Gegevens worden geladen wanneer dit echt nodig is. Hier is het wanneer u write
uitvoert actie en wanneer u begint te schrijven, hoeven er geen gegevens meer te worden opgehaald.
Wat je nodig hebt is zoiets als dit:
- Maak een
Dataset
. -
Pas de vereiste transformaties toe en schrijf gegevens naar een tussenliggende MySQL-tabel.
-
TRUNCATE
de originele invoer enINSERT INTO ... SELECT
uit de tussentabel ofDROP
de originele tabel enRENAME
tussentafel.
Een alternatieve, maar minder gunstige benadering zou zijn:
- Maak een
Dataset
. - Vereiste transformaties toepassen en gegevens schrijven naar een permanente Spark-tabel (
df.write.saveAsTable(...)
of gelijkwaardig) TRUNCATE
de originele invoer.- Gegevens teruglezen en opslaan (
spark.table(...).write.jdbc(...)
) - Drop Spark-tabel.
We kunnen niet genoeg benadrukken dat het gebruik van Spark cache
/ persist
is niet de weg te gaan. Zelfs met het conservatieve StorageLevel
(MEMORY_AND_DISK_2
/ MEMORY_AND_DISK_SER_2
) gegevens in de cache kunnen verloren gaan (knooppuntstoringen), wat leidt tot stille correctheidsfouten.