Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Spark SQL i MySQL- SaveMode.Overwrite nie wstawiając zmodyfikowanych danych

Problem tkwi w twoim kodzie. Ponieważ zastępujesz tabelę, z której próbujesz odczytać, skutecznie usuwasz wszystkie dane, zanim Spark będzie mógł uzyskać do nich dostęp.

Pamiętaj, że Spark jest leniwy. Kiedy tworzysz Dataset Spark pobiera wymagane metadane, ale nie ładuje danych. Nie ma więc magicznej pamięci podręcznej, która zachowa oryginalną zawartość. Dane zostaną załadowane, gdy będzie to rzeczywiście potrzebne. Oto, kiedy wykonujesz write a kiedy zaczniesz pisać, nie ma więcej danych do pobrania.

Potrzebujesz czegoś takiego:

  • Utwórz Dataset .
  • Zastosuj wymagane przekształcenia i zapisz dane w pośredniej tabeli MySQL.

  • TRUNCATE oryginalne wejście i INSERT INTO ... SELECT z tabeli pośredniej lub DROP oryginalna tabela i RENAME stół pośredni.

Alternatywnym, ale mniej korzystnym podejściem byłoby:

  • Utwórz Dataset .
  • Zastosuj wymagane przekształcenia i zapisz dane do trwałej tabeli Spark (df.write.saveAsTable(...) lub odpowiednik)
  • TRUNCATE oryginalne wejście.
  • Odczytaj dane z powrotem i zapisz (spark.table(...).write.jdbc(...) )
  • Upuść tabelę Spark.

Nie możemy wystarczająco podkreślić, że używanie Spark cache / persist to nie jest droga do zrobienia. Nawet z konserwatywnym StorageLevel (MEMORY_AND_DISK_2 / MEMORY_AND_DISK_SER_2 ) dane z pamięci podręcznej mogą zostać utracone (awarie węzłów), co prowadzi do cichych błędów poprawności.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jeden do wielu MySQL

  2. Zserializowana tablica wartości meta WooCommerce w tabeli wp_postmeta

  3. C# Błąd MySQL Liczba kolumn nie odpowiada liczbie wartości w wierszu 1

  4. PHP:Jeśli rekord istnieje, wyświetlaj kod HTML, w przeciwnym razie nie wyświetlaj nic

  5. Dodaj kolumnę do wszystkich zapytań MySQL Select w jednym ujęciu