2 идеи для повышения производительности: кешировать задания df1 и / или запускать параллельные искры, например, используя параллельные коллекции, например:
df1.cache()
val tablename:Array[String] = df1.select(trim("msgname")).distinct().as[String].collect
tablename
.par // enable parallel execution
.foreach{table =>
df1.filter(s"msgname ='$table'").select("record_data").write.saveAsTable(s"$table")
}