Pertama-tama, jenis kueri yang Anda lakukan sangat tidak efisien. Adapun sekarang (Spark 1.5.0*) untuk melakukan join seperti ini, kedua tabel harus diacak / dipartisi hash setiap kali query dijalankan. Seharusnya tidak menjadi masalah jika users
tabel di mana user_id = 123
predikat kemungkinan besar didorong ke bawah tetapi masih membutuhkan pengocokan penuh pada user_address
.
Selain itu, jika tabel hanya terdaftar dan tidak di-cache, maka setiap eksekusi kueri ini akan mengambil seluruh user_address
tabel dari MySQL ke Spark.
Tidak jelas mengapa Anda ingin menggunakan Spark untuk aplikasi, tetapi penyiapan mesin tunggal, data kecil, dan jenis kueri menunjukkan bahwa Spark tidak cocok di sini.
Secara umum jika logika aplikasi memerlukan akses rekaman tunggal maka Spark SQL tidak akan bekerja dengan baik. Ini dirancang untuk kueri analitik, bukan sebagai pengganti basis data OLTP.
Jika satu tabel / bingkai data jauh lebih kecil, Anda dapat mencoba menyiarkan.
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")
* Ini akan berubah di Spark 1.6.0 dengan SPARK-11410 yang seharusnya mengaktifkan partisi tabel persisten.