sql >> Databasteknik >  >> RDS >> Mysql

Spark SQL/Hive-fråga tar evigheter med Join

Först och främst är den typ av fråga du utför extremt ineffektiv. Som nu (Spark 1.5.0*) för att utföra join på det här sättet, måste båda tabellerna blandas/hash-partitioneras varje gång en fråga exekveras. Det borde inte vara ett problem för users tabell där user_id = 123 Predikat är troligen nedtryckt men kräver fortfarande fullständig blandning på user_address .

Dessutom, om tabeller endast är registrerade och inte cachade, kommer varje körning av denna fråga att hämta en hel user_address tabell från MySQL till Spark.

Det är inte riktigt klart varför du vill använda Spark för applikationer men enstaka maskininstallationer, små data och typ av frågor tyder på att Spark inte passar här.

Generellt sett kommer Spark SQL inte att fungera bra om applikationslogik kräver en enda poståtkomst. Den är designad för analytiska frågor, inte som en OLTP-databasersättning.

Om en enskild tabell/dataram är mycket mindre kan du prova att sända.

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

* Detta bör ändras i Spark 1.6.0 med SPARK-11410 vilket bör möjliggöra beständig tabellpartitionering.



  1. MySQL WHERE LIKE fungerar inte med flera fält med php och pdo bind

  2. Det renaste sättet att bygga en SQL-sträng i Java

  3. Allvarligt fel:Array-återuppringning måste innehålla index 0 och 1

  4. Vad är lösningen för att använda dynamisk SQL i en lagrad procedur