sql >> Databáze >  >> RDS >> Mysql

Spark SQL a MySQL – SaveMode.Overwrite nevkládá upravená data

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 a INSERT INTO ... SELECT z přechodné tabulky nebo DROP původní tabulku a RENAME 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.



  1. Rozdíl mezi LockModeType Jpa

  2. Seskupování podobných řádků vedle sebe v MySQL

  3. Zálohujte/obnovte ukotvenou databázi PostgreSQL

  4. Importujte data z tabulky Excel nebo CVS do MySQL