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

Spark SQL/Hive-forespørgsel tager evigheder med Join

Først og fremmest er den type forespørgsel, du udfører, ekstremt ineffektiv. For nu (Spark 1.5.0*) for at udføre join som denne, skal begge tabeller blandes / hash-partitioneres hver gang forespørgslen udføres. Det burde ikke være et problem i tilfælde af users tabel hvor user_id = 123 prædikat er højst sandsynligt skubbet ned, men kræver stadig fuld shuffle på user_address .

Desuden, hvis tabeller kun er registreret og ikke cachelagret, vil hver udførelse af denne forespørgsel hente en hel user_address tabel fra MySQL til Spark.

Det er ikke helt klart, hvorfor du vil bruge Spark til applikation, men opsætning af enkelt maskine, små data og type forespørgsler tyder på, at Spark ikke passer godt her.

Generelt set vil Spark SQL ikke fungere godt, hvis applikationslogik kræver en enkelt postadgang. Den er designet til analytiske forespørgsler, ikke som en OLTP-databaseerstatning.

Hvis en enkelt tabel/dataramme er meget mindre, kan du prøve at udsende.

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

* Dette skulle ændre sig i Spark 1.6.0 med SPARK-11410 som skulle muliggøre vedvarende tabelpartitionering.



  1. Brug en lagret procedureparameter til enhedsparameteren DATE_SUB

  2. Kald pusher, når mysql har ændret sig

  3. JDBC-forbindelse mislykkedes, fejl:TCP/IP-forbindelse til vært mislykkedes

  4. Lagring af IP-adresse i MySQL-database (IPv4 OG IPv6)