sql >> Database >  >> RDS >> Mysql

Spark SQL en MySQL- SaveMode.Overwrite voegt geen gewijzigde gegevens toe

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 en INSERT INTO ... SELECT uit de tussentabel of DROP de originele tabel en RENAME 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.



  1. Hoe om te gaan met booleaanse waarden in SQLite met JavaScript-proxy's

  2. ID ophalen van een voorwaardelijke INSERT

  3. MySQL start niet bij het upgraden van OSX naar Yosemite of El Capitan

  4. MijnSQL - SQL_BIG_SELECTS