sql >> Database teknologi >  >> RDS >> Mysql

Spark SQL og MySQL- SaveMode. Overskriv ikke indsættelse af ændrede data

Problemet ligger i din kode. Fordi du overskriver en tabel, hvorfra du forsøger at læse, sletter du effektivt alle data, før Spark rent faktisk kan få adgang til det.

Husk at Spark er doven. Når du opretter et Dataset Spark henter nødvendige metadata, men indlæser ikke dataene. Så der er ingen magisk cache, som vil bevare det originale indhold. Data vil blive indlæst, når det faktisk er påkrævet. Her er det, når du udfører write handling, og når du begynder at skrive, er der ikke flere data at hente.

Det du har brug for er noget som dette:

  • Opret et Dataset .
  • Anvend nødvendige transformationer og skriv data til en mellemliggende MySQL-tabel.

  • TRUNCATE det originale input og INSERT INTO ... SELECT fra den mellemliggende tabel eller DROP den originale tabel og RENAME mellemtabel.

Alternativ, men mindre gunstig tilgang, ville være:

  • Opret et Dataset .
  • Anvend nødvendige transformationer og skriv data til en vedvarende Spark-tabel (df.write.saveAsTable(...) eller tilsvarende)
  • TRUNCATE det originale input.
  • Læs data tilbage og gem (spark.table(...).write.jdbc(...) )
  • Drop Spark-bord.

Vi kan ikke understrege nok, at brugen af ​​Spark cache / persist er ikke vejen at gå. Selv med det konservative StorageLevel (MEMORY_AND_DISK_2 / MEMORY_AND_DISK_SER_2 ) cachelagrede data kan gå tabt (nodefejl), hvilket fører til tavse korrekthedsfejl.



  1. Forbinder PostgreSQL 9.2.1 med Hibernate

  2. PLSQL :NY og :GAMMEL

  3. Sådan angives en fane i en postgres frontend COPY

  4. Hvordan viser man Oracle-skemastørrelse med SQL-forespørgsel?