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 iINSERT INTO ... SELECT
z tabeli pośredniej lubDROP
oryginalna tabela iRENAME
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.