Mysql
 sql >> база данни >  >> RDS >> Mysql

Spark SQL и MySQL- SaveMode.Overwrite без вмъкване на модифицирани данни

Проблемът е във вашия код. Тъй като презаписвате таблица, от която се опитвате да четете, ефективно заличавате всички данни, преди Spark действително да има достъп до тях.

Не забравяйте, че Spark е мързелив. Когато създавате Dataset Spark извлича необходимите метаданни, но не зарежда данните. Така че няма магически кеш, който да запази оригиналното съдържание. Данните ще бъдат заредени, когато действително се изискват. Ето го, когато изпълнявате write действие и когато започнете да пишете, няма повече данни за извличане.

Това, от което се нуждаете, е нещо подобно:

  • Създайте Dataset .
  • Приложете необходимите трансформации и запишете данни в междинна MySQL таблица.

  • TRUNCATE оригиналния вход и INSERT INTO ... SELECT от междинната таблица или DROP оригиналната таблица и RENAME междинна маса.

Алтернативен, но по-малко благоприятен подход би бил:

  • Създайте Dataset .
  • Приложете необходимите трансформации и запишете данни към постоянна таблица на Spark (df.write.saveAsTable(...) или еквивалент)
  • TRUNCATE оригиналния вход.
  • Прочетете обратно данните и запазете (spark.table(...).write.jdbc(...) )
  • Пуснете таблицата Spark.

Не можем да подчертаем достатъчно, че използваме cache на Spark / persist не е пътят. Дори и с консервативния StorageLevel (MEMORY_AND_DISK_2 / MEMORY_AND_DISK_SER_2 ) кешираните данни могат да бъдат загубени (отказ на възли), което води до тихи грешки при коректността.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sequelize геопространствена заявка:намерете n най-близки точки до местоположение

  2. Как да нормализирате стойностите, разделени със запетая, в колоната на таблицата и след това да изпълните заявка

  3. Източникът на данни отхвърли установяване на връзка, съобщение от сървъра:Твърде много връзки

  4. Проблем с буфера на MySqlDataReader GetBytes...

  5. Laravel 4:Където не съществува