Trước hết, loại truy vấn bạn thực hiện cực kỳ kém hiệu quả. Hiện tại (Spark 1.5.0 *) để thực hiện phép nối như thế này, cả hai bảng phải được xáo trộn / phân vùng băm mỗi khi truy vấn được thực thi. Sẽ không có vấn đề gì trong trường hợp người dùng users
bảng trong đó user_id = 123
vị từ rất có thể được đẩy xuống nhưng vẫn yêu cầu xáo trộn đầy đủ trên user_address
.
Hơn nữa, nếu các bảng chỉ được đăng ký và không được lưu vào bộ nhớ đệm, thì mọi thực thi truy vấn này sẽ tìm nạp toàn bộ user_address
bảng từ MySQL sang Spark.
Không rõ chính xác tại sao bạn muốn sử dụng Spark cho ứng dụng nhưng thiết lập máy đơn lẻ, dữ liệu nhỏ và loại truy vấn cho thấy Spark không phù hợp ở đây.
Nói chung, nếu logic ứng dụng yêu cầu một quyền truy cập bản ghi thì Spark SQL sẽ không hoạt động tốt. Nó được thiết kế cho các truy vấn phân tích không phải là sự thay thế cơ sở dữ liệu OLTP.
Nếu một bảng / khung dữ liệu nhỏ hơn nhiều, bạn có thể thử phát.
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")
* Điều này sẽ thay đổi trong Spark 1.6.0 với SPARK-11410 sẽ cho phép phân vùng bảng liên tục.