DataFrame rejoindre optimisation de la Diffusion de Jointure de Hachage
J'essaie effectivement de joindre deux DataFrames, dont l'une est grande et la deuxième est un peu plus petit.
Est-il un moyen pour éviter tout ce brassage? Je ne peux pas définir autoBroadCastJoinThreshold
, car il prend en charge uniquement les Entiers et la table, je suis en train de diffusion est légèrement plus grand que le nombre entier d'octets.
Est-il un moyen de forcer la diffusion en ignorant cette variable?
se sentir comme votre question est "Est-il un moyen de forcer la diffusion en ignorant cette variable?" Il peut être contrôlé par le biais de la propriété je l'ai mentionné ci-dessous.. Car personne adressée, pour le rendre pertinent que j'ai donné cette réponse tardive.Espérons que ça aide!
Veuillez accepter, une fois les réponses acceptées. il sera pointeur vers les autres. Merci!
Veuillez accepter, une fois les réponses acceptées. il sera pointeur vers les autres. Merci!
OriginalL'auteur NNamed | 2015-09-07
Vous devez vous connecter pour publier un commentaire.
Diffuser les Jointures de Hachage (similaire à carte de jointure côté ou de la carte du côté de combiner dans Mapreduce) :
Dans SparkSQL vous pouvez voir le type de jointure être exécutée en appelant
queryExecution.executedPlan
. Comme avec le noyau de l'Étincelle, si l'une des tables est beaucoup plus petite que l'autre, vous voudrez peut-être une émission de jointure de hachage. Vous pouvez soupçon de Spark SQL qu'un DF devrait être diffusé pour rejoindre en appelant la méthodebroadcast
sur leDataFrame
avant de se joindre à elleExemple:
largedataframe.join(broadcast(smalldataframe), "key")
Comme décrit par mes fav livre (HPS) pls. voir ci-dessous pour avoir une meilleure compréhension..
Note : au-Dessus de
broadcast
est deimport org.apache.spark.sql.functions.broadcast
pas deSparkContext
Étincelle aussi, utilise automatiquement le
spark.sql.conf.autoBroadcastJoinThreshold
pour déterminer si une table doit être diffusée.Astuce : voir DataFrame.expliquer() la méthode
sqlContext.sql("SET spark.sql.autoBroadcastJoinThreshold = -1")
REMARQUE :
Pls. suivre SparkStrategies.scala ici, tous les cas ont été mentionnés. ses pas le seul paquebot de l'écrire ici ... changer left_outer à right_outer résultat sera changé.
mais dans le cas normal, Table1 LEFT OUTER JOIN Table2, Table2 JOINTURE EXTERNE DROITE Table1 sont égaux
OriginalL'auteur Ram Ghadiyaram
Vous pouvez le conseil pour un dataframe à être diffusés par l'aide de
left.join(broadcast(right), ...)
broadcast
n'est pas résoluble.C'est sous org.apache.spark.sql.fonctions, vous avez besoin de l'étincelle 1.5.0 ou plus récent
Parfait, merci beaucoup, j'ai essayé d'utiliser la méthode de diffusion en SparkContext.
Aucune chance de faire allusion à la diffusion joindre à une instruction SQL?
Vous pouvez utiliser l'indicateur dans une instruction SQL en effet, mais vous ne savez pas dans quelle mesure cela fonctionne. par exemple, je l'ai utilisé comme
left inner join broadcast(right)
ne sais pas si cela fonctionnera avec une sous-requêteOriginalL'auteur Sebastian Piu
Réglage
spark.sql.autoBroadcastJoinThreshold = -1
va désactiver la diffusion complètement. VoirD'autres Options de Configuration Spark SQL, DataFrames et des ensembles de données Guide de l'.
OriginalL'auteur Vishal Gupta
C'est une limitation actuelle de la spark, voir SPARK-6235. La limite de 2 go s'applique également pour la diffusion de variables.
Êtes-vous sûr qu'il n'y est aucune autre bonne façon de le faire, par exemple de partitionnement différent?
Sinon, vous pouvez pirater votre chemin autour de lui par la main de diffusion de la création de plusieurs variables qui sont chaque <2 GO.
OriginalL'auteur dpeacock
J'ai trouvé ce code fonctionne pour la Diffusion Rejoindre Spark 2.11 de la version 2.0.0.
Ici est la référence pour le code ci-dessus Henning Kropp Blog, Diffusion de Jointure avec Spark
OriginalL'auteur SparkleGoat