Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Spark SQL/Hive-Abfrage dauert ewig mit Join

Zunächst einmal ist die Art der Abfrage, die Sie durchführen, äußerst ineffizient. Ab sofort (Spark 1.5.0 *) müssen beide Tabellen bei jeder Ausführung der Abfrage gemischt / hash-partitioniert werden, um eine solche Verknüpfung durchzuführen. Für users sollte es kein Problem sein Tabelle mit user_id = 123 Das Prädikat wird höchstwahrscheinlich nach unten verschoben, erfordert aber immer noch ein vollständiges Mischen auf user_address .

Wenn Tabellen nur registriert und nicht zwischengespeichert werden, wird außerdem jede Ausführung dieser Abfrage eine ganze user_address abrufen Tabelle von MySQL zu Spark.

Es ist nicht ganz klar, warum Sie Spark für die Anwendung verwenden möchten, aber die Einrichtung eines einzelnen Computers, kleine Daten und die Art der Abfragen deuten darauf hin, dass Spark hier nicht gut geeignet ist.

Wenn die Anwendungslogik einen einzelnen Datensatzzugriff erfordert, wird Spark SQL im Allgemeinen keine gute Leistung erbringen. Es ist für analytische Abfragen konzipiert und nicht als Ersatz für eine OLTP-Datenbank.

Wenn eine einzelne Tabelle / ein Datenrahmen viel kleiner ist, können Sie versuchen, zu senden.

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

* Dies sollte sich in Spark 1.6.0 mit SPARK-11410 ändern was die persistente Tabellenpartitionierung ermöglichen sollte.