sql >> Databasteknik >  >> RDS >> Mysql

Spark SQL och MySQL- SaveMode.Skriv över utan att infoga modifierade data

Problemet ligger i din kod. Eftersom du skriver över en tabell från vilken du försöker läsa utplånar du effektivt all data innan Spark faktiskt kan komma åt den.

Kom ihåg att Spark är lat. När du skapar en Dataset Spark hämtar nödvändig metadata, men laddar inte in data. Så det finns ingen magisk cache som kommer att bevara originalinnehållet. Data kommer att laddas när det verkligen behövs. Här är det när du kör write action och när du börjar skriva finns det ingen mer data att hämta.

Vad du behöver är något i stil med detta:

  • Skapa en Dataset .
  • Tillämpa nödvändiga transformationer och skriv data till en mellanliggande MySQL-tabell.

  • TRUNCATE den ursprungliga ingången och INSERT INTO ... SELECT från den mellanliggande tabellen eller DROP den ursprungliga tabellen och RENAME mellantabell.

Ett alternativ, men mindre fördelaktigt tillvägagångssätt, skulle vara:

  • Skapa en Dataset .
  • Tillämpa nödvändiga transformationer och skriv data till en beständig Spark-tabell (df.write.saveAsTable(...) eller motsvarande)
  • TRUNCATE den ursprungliga inmatningen.
  • Läs tillbaka data och spara (spark.table(...).write.jdbc(...) )
  • Släpp Spark-tabellen.

Vi kan inte nog betona att använda Spark cache / persist är inte rätt väg att gå. Även med den konservativa StorageLevel (MEMORY_AND_DISK_2 / MEMORY_AND_DISK_SER_2 ) cachad data kan gå förlorad (nodfel), vilket leder till tysta korrekthetsfel.



  1. Villkorlig aggregeringsprestanda

  2. Hur hittar man icke-existerande data från en annan tabell genom att JOIN?

  3. Summering av datumintervall utan att räkna överlappningar i mysql

  4. Mysql count antal regex-matchningar per fält