Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

O Spark SQL/Hive Query demora para sempre com a junção


Em primeiro lugar, o tipo de consulta que você executa é extremamente ineficiente. Por enquanto (Spark 1.5.0*) para realizar a junção assim, ambas as tabelas devem ser embaralhadas / particionadas por hash cada vez que a consulta é executada. Não deve ser um problema no caso de users tabela onde user_id = 123 o predicado provavelmente está pressionado, mas ainda requer embaralhamento completo em user_address .

Além disso, se as tabelas forem apenas registradas e não armazenadas em cache, cada execução dessa consulta buscará um user_address inteiro tabela do MySQL para o Spark.

Não está exatamente claro por que você deseja usar o Spark para aplicativos, mas a configuração de uma única máquina, pequenos dados e tipos de consultas sugerem que o Spark não é uma boa opção aqui.

De um modo geral, se a lógica do aplicativo exigir um acesso de registro único, o Spark SQL não terá um bom desempenho. Ele é projetado para consultas analíticas e não como uma substituição de banco de dados OLTP.

Se uma única tabela / quadro de dados for muito menor, você pode tentar 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")

* Isso deve mudar no Spark 1.6.0 com SPARK-11410 que deve habilitar o particionamento de tabela persistente.