Problém je ve vašem kódu. Protože přepíšete tabulku, ze které se snažíte číst, efektivně vymažete všechna data dříve, než k nim Spark skutečně přistoupí.
Pamatujte, že Spark je líný. Když vytvoříte Dataset Spark načte požadovaná metadata, ale nenačte data. Neexistuje tedy žádná magická mezipaměť, která by zachovala původní obsah. Data se načtou, až budou skutečně potřeba. Zde je, když spustíte write a když začnete psát, nebudou již žádná data k načtení.
Potřebujete něco takového:
- Vytvořte
Dataset. -
Použijte požadované transformace a zapište data do prostřední tabulky MySQL.
-
TRUNCATEpůvodní vstup aINSERT INTO ... SELECTz přechodné tabulky neboDROPpůvodní tabulku aRENAMEmezitabulka.
Alternativní, ale méně příznivý přístup by byl:
- Vytvořte
Dataset. - Použijte požadované transformace a zapište data do trvalé tabulky Spark (
df.write.saveAsTable(...)nebo ekvivalentní) TRUNCATEpůvodní vstup.- Přečtěte si data zpět a uložte (
spark.table(...).write.jdbc(...)) - Drop Spark table.
Nemůžeme dostatečně zdůraznit, že používání Spark cache / persist není způsob, jak jít. Dokonce i s konzervativním StorageLevel (MEMORY_AND_DISK_2 / MEMORY_AND_DISK_SER_2 ) data uložená v mezipaměti mohou být ztracena (selhání uzlů), což vede k tichým chybám správnosti.