Za prvé, typ dotazu, který provádíte, je extrémně neefektivní. Jako prozatím (Spark 1.5.0*), aby bylo možné provést spojení takto, musí být obě tabulky zamíchány / rozděleny hashovacími oddíly pokaždé, když se provede dotaz. V případě users
by to neměl být problém tabulka, kde user_id = 123
predikát je s největší pravděpodobností posunut dolů, ale stále vyžaduje úplné zamíchání user_address
.
Navíc, pokud jsou tabulky pouze registrované a nejsou ukládány do mezipaměti, pak každé provedení tohoto dotazu načte celou user_address
tabulky z MySQL do Sparku.
Není přesně jasné, proč chcete pro aplikaci používat Spark, ale nastavení jednoho stroje, malá data a typ dotazů naznačují, že Spark se sem nehodí.
Obecně řečeno, pokud aplikační logika vyžaduje přístup k jedinému záznamu, pak Spark SQL nebude fungovat dobře. Je navržen pro analytické dotazy, nikoli jako náhrada databáze OLTP.
Pokud je jedna tabulka / datový rámec mnohem menší, můžete zkusit vysílání.
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")
* To by se mělo změnit ve Sparku 1.6.0 s SPARK-11410 což by mělo umožnit trvalé dělení tabulek.