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 ochINSERT INTO ... SELECT
från den mellanliggande tabellen ellerDROP
den ursprungliga tabellen ochRENAME
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.