Først og fremmest er den type forespørgsel, du udfører, ekstremt ineffektiv. For nu (Spark 1.5.0*) for at udføre join som denne, skal begge tabeller blandes / hash-partitioneres hver gang forespørgslen udføres. Det burde ikke være et problem i tilfælde af users
tabel hvor user_id = 123
prædikat er højst sandsynligt skubbet ned, men kræver stadig fuld shuffle på user_address
.
Desuden, hvis tabeller kun er registreret og ikke cachelagret, vil hver udførelse af denne forespørgsel hente en hel user_address
tabel fra MySQL til Spark.
Det er ikke helt klart, hvorfor du vil bruge Spark til applikation, men opsætning af enkelt maskine, små data og type forespørgsler tyder på, at Spark ikke passer godt her.
Generelt set vil Spark SQL ikke fungere godt, hvis applikationslogik kræver en enkelt postadgang. Den er designet til analytiske forespørgsler, ikke som en OLTP-databaseerstatning.
Hvis en enkelt tabel/dataramme er meget mindre, kan du prøve at udsende.
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")
* Dette skulle ændre sig i Spark 1.6.0 med SPARK-11410 som skulle muliggøre vedvarende tabelpartitionering.