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.
-
TRUNCATE
původní vstup aINSERT INTO ... SELECT
z přechodné tabulky neboDROP
původní tabulku aRENAME
mezitabulka.
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í) TRUNCATE
pů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.