Innanzitutto il tipo di query che esegui è estremamente inefficiente. Per ora (Spark 1.5.0*) per eseguire un join in questo modo, entrambe le tabelle devono essere mescolate / partizionate con hash ogni volta che viene eseguita la query. Non dovrebbe essere un problema in caso di users
tabella dove user_id = 123
il predicato è molto probabilmente spostato verso il basso, ma richiede comunque la riproduzione casuale completa su user_address
.
Inoltre, se le tabelle sono solo registrate e non memorizzate nella cache, ogni esecuzione di questa query recupererà un intero user_address
tabella da MySQL a Spark.
Non è esattamente chiaro il motivo per cui desideri utilizzare Spark per l'applicazione, ma la configurazione di una singola macchina, i dati piccoli e il tipo di query suggeriscono che Spark non si adatta bene qui.
In generale, se la logica dell'applicazione richiede un unico accesso al record, Spark SQL non funzionerà bene. È progettato per query analitiche non come sostituzione del database OLTP.
Se una singola tabella/frame di dati è molto più piccola, puoi provare a trasmettere.
import org.apache.spark.sql.DataFrame
import org.apache.spark.sql.functions.broadcast
val user: DataFrame = ???
val user_address: DataFrame = ???
val userFiltered = user.where(???)
user_addresses.join(
broadcast(userFiltered), $"address_id" === $"user_address_id")
* Questo dovrebbe cambiare in Spark 1.6.0 con SPARK-11410 che dovrebbe abilitare il partizionamento persistente della tabella.