sql >> Base de Datos >  >> RDS >> Mysql

Spark SQL/Hive Query tarda una eternidad con Join

En primer lugar, el tipo de consulta que realiza es extremadamente ineficiente. Por ahora (Spark 1.5.0*) para realizar una unión como esta, ambas tablas deben barajarse/particionarse mediante hash cada vez que se ejecuta la consulta. No debería ser un problema en el caso de users tabla donde user_id = 123 lo más probable es que el predicado se reduzca, pero aún requiere una reproducción aleatoria completa en user_address .

Además, si las tablas solo se registran y no se almacenan en caché, cada ejecución de esta consulta obtendrá una user_address completa. tabla de MySQL a Spark.

No está exactamente claro por qué desea usar Spark para la aplicación, pero la configuración de una sola máquina, los datos pequeños y el tipo de consultas sugieren que Spark no es una buena opción aquí.

En términos generales, si la lógica de la aplicación requiere un único acceso a un registro, Spark SQL no funcionará bien. Está diseñado para consultas analíticas, no como un reemplazo de la base de datos OLTP.

Si una sola tabla/marco de datos es mucho más pequeño, puede intentar transmitir.

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")

* Esto debería cambiar en Spark 1.6.0 con SPARK-11410 que debería habilitar la partición persistente de tablas.