sql >> Database >  >> RDS >> Mysql

Spark SQL/Hive-query duurt eeuwig met Join

Allereerst is het type zoekopdracht dat u uitvoert buitengewoon inefficiënt. Voor nu (Spark 1.5.0*) om join op deze manier uit te voeren, moeten beide tabellen worden geschud / gehash-partitioneerd elke keer dat de query wordt uitgevoerd. Het zou geen probleem moeten zijn in het geval van users tabel waar user_id = 123 predikaat is hoogstwaarschijnlijk ingedrukt, maar vereist nog steeds volledige shuffle op user_address .

Bovendien, als tabellen alleen worden geregistreerd en niet in de cache worden opgeslagen, zal elke uitvoering van deze query een heel user_address ophalen tabel van MySQL naar Spark.

Het is niet precies duidelijk waarom u Spark wilt gebruiken voor toepassingen, maar het instellen van een enkele machine, kleine gegevens en type query's suggereren dat Spark hier niet goed past.

Over het algemeen zal Spark SQL niet goed presteren als toepassingslogica toegang tot één record vereist. Het is ontworpen voor analytische zoekopdrachten en niet als vervanging van een OLTP-database.

Als een enkele tabel / dataframe veel kleiner is, kun je proberen te broadcasten.

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

* Dit zou in Spark 1.6.0 moeten veranderen met SPARK-11410 die permanente tabelpartitionering zou moeten inschakelen.



  1. Optimaliseer MySQL-query's met veel LEFT JOINs en GROUP BY

  2. MySQL vergelijk now() (alleen datum, geen tijd) met een datetime-veld

  3. Anonimiseer uw abonnementsgegevens in Plan Explorer

  4. Gegevens visualiseren