Mysql
 sql >> Database >  >> RDS >> Mysql

La query Spark SQL/Hive dura per sempre con Join

Innanzitutto il tipo di query che esegui è estremamente inefficiente. Per ora (Spark 1.5.0*) per eseguire un join in questo modo, entrambe le tabelle devono essere mescolate / partizionate con hash ogni volta che viene eseguita la query. Non dovrebbe essere un problema in caso di users tabella dove user_id = 123 il predicato è molto probabilmente spostato verso il basso, ma richiede comunque la riproduzione casuale completa su user_address .

Inoltre, se le tabelle sono solo registrate e non memorizzate nella cache, ogni esecuzione di questa query recupererà un intero user_address tabella da MySQL a Spark.

Non è esattamente chiaro il motivo per cui desideri utilizzare Spark per l'applicazione, ma la configurazione di una singola macchina, i dati piccoli e il tipo di query suggeriscono che Spark non si adatta bene qui.

In generale, se la logica dell'applicazione richiede un unico accesso al record, Spark SQL non funzionerà bene. È progettato per query analitiche non come sostituzione del database OLTP.

Se una singola tabella/frame di dati è molto più piccola, puoi provare a trasmettere.

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

* Questo dovrebbe cambiare in Spark 1.6.0 con SPARK-11410 che dovrebbe abilitare il partizionamento persistente della tabella.