Plus propre, plus efficace syntaxe pour effectuer DataFrame auto-jointure dans Spark

Dans le standard SQL, lorsque vous rejoignez une table à elle-même, vous pouvez créer des alias pour les tables de garder une trace de colonnes que vous faites référence à:

SELECT a.column_name, b.column_name...
FROM table1 a, table1 b
WHERE a.common_field = b.common_field;

Il y a deux façons que je peux penser à obtenir la même chose en utilisant l'Étincelle DataFrame API:

Solution #1: Renommer les colonnes

Il ya un couple de différentes méthodes pour cela en réponse à cette question. Juste renomme toutes les colonnes avec un suffixe spécifique:

df.toDF(df.columns.map(_ + "_R"):_*)

Par exemple, vous pouvez faire:

df.join(df.toDF(df.columns.map(_ + "_R"):_*), $"common_field" === $"common_field_R")

Solution #2: Copie de la référence à la DataFrame

Une solution simple est de simplement faire ceci:

val df: DataFrame = ....
val df_right = df

df.join(df_right, df("common_field") === df_right("common_field"))

Deux de ces solutions ne fonctionne, et je pouvais voir chaque être utile dans certaines situations. Existe-il des différences internes entre les deux, je devrais être au courant?

OriginalL'auteur David Griffin | 2016-03-27