Tout d'abord, le type de requête que vous effectuez est extrêmement inefficace. Pour l'instant (Spark 1.5.0 *) pour effectuer une jointure comme celle-ci, les deux tables doivent être mélangées / partitionnées par hachage à chaque exécution de la requête. Cela ne devrait pas poser de problème dans le cas des users
table où user_id = 123
le prédicat est très probablement poussé vers le bas mais nécessite toujours un mélange complet sur user_address
.
De plus, si les tables sont uniquement enregistrées et non mises en cache, alors chaque exécution de cette requête récupérera un ensemble user_address
table de MySQL vers Spark.
La raison pour laquelle vous souhaitez utiliser Spark pour l'application n'est pas claire, mais la configuration d'une seule machine, les petites données et le type de requêtes suggèrent que Spark n'est pas un bon choix ici.
De manière générale, si la logique d'application nécessite un accès à un seul enregistrement, Spark SQL ne fonctionnera pas bien. Il est conçu pour les requêtes analytiques et non pour remplacer la base de données OLTP.
Si une seule table / trame de données est beaucoup plus petite, vous pouvez essayer de diffuser.
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")
* Cela devrait changer dans Spark 1.6.0 avec SPARK-11410 qui devrait permettre le partitionnement persistant des tables.