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.
-
TRUNCATEoryginalne wejście iINSERT INTO ... SELECTz tabeli pośredniej lubDROPoryginalna tabela iRENAMEstół 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) TRUNCATEoryginalne 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.