Först och främst är den typ av fråga du utför extremt ineffektiv. Som nu (Spark 1.5.0*) för att utföra join på det här sättet, måste båda tabellerna blandas/hash-partitioneras varje gång en fråga exekveras. Det borde inte vara ett problem för users
tabell där user_id = 123
Predikat är troligen nedtryckt men kräver fortfarande fullständig blandning på user_address
.
Dessutom, om tabeller endast är registrerade och inte cachade, kommer varje körning av denna fråga att hämta en hel user_address
tabell från MySQL till Spark.
Det är inte riktigt klart varför du vill använda Spark för applikationer men enstaka maskininstallationer, små data och typ av frågor tyder på att Spark inte passar här.
Generellt sett kommer Spark SQL inte att fungera bra om applikationslogik kräver en enda poståtkomst. Den är designad för analytiska frågor, inte som en OLTP-databasersättning.
Om en enskild tabell/dataram är mycket mindre kan du prova att sända.
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")
* Detta bör ändras i Spark 1.6.0 med SPARK-11410 vilket bör möjliggöra beständig tabellpartitionering.