Comment éviter de dupliquer les colonnes après les rejoindre?
J'ai deux dataframes avec les colonnes suivantes:
df1.columns
// Array(ts, id, X1, X2)
et
df2.columns
// Array(ts, id, Y1, Y2)
Après je ne
val df_combined = df1.join(df2, Seq(ts,id))
Je me retrouve avec les colonnes suivantes: Array(ts, id, X1, X2, ts, id, Y1, Y2)
. J'ai pu s'attendre à ce que le commun des colonnes serait tombé. Est-il quelque chose que d'autres qui doit être fait?
Si vous avez défini les colonnes de jointure comme un
Seq
de chaînes de caractères (pour les noms de colonnes), puis les colonnes ne doivent pas être dupliqués. Voir ma réponse ci-dessous.OriginalL'auteur Neel | 2016-02-07
Vous devez vous connecter pour publier un commentaire.
La réponse la plus simple (à partir de la Databricks FAQ à ce sujet) est à effectuer la jointure où les colonnes jointes sont exprimées comme un tableau de chaînes de caractères (ou une chaîne) au lieu d'un prédicat.
Ci-dessous est un exemple adapté de la Databricks FAQ, mais avec deux colonnes de jointure afin de répondre à l'affiche originale de la question.
Ici est la gauche dataframe:
Ici est la droit dataframe:
Voici un incorrect solution, où les colonnes de jointure sont définis comme le prédicat
left("firstname")===right("firstname") && left("lastname")===right("lastname")
.Le résultat incorrect est que le
firstname
etlastname
colonnes sont dupliquées dans le joint sur le bloc de données:La corriger solution est de définir les colonnes de jointure comme un tableau de chaînes
Seq("firstname", "lastname")
. La sortie du bloc de données n'a pas dupliqué colonnes:val joined = sampledDF.join(idsDF, idColumns, "inner")
. et oùidColumns
est un Seq[String] contenant les colonnes de jointureJe ne pense pas que cela fonctionne si les noms des colonnes dans les deux ensembles de données sont différentes.
Que faire quand de 4 rejoindre exprs, 2 colonnes différentes dans les deux tables, mais les 2 se réfère aux mêmes colonnes sur les deux tableaux. renommer?
OriginalL'auteur
C'est un comportement attendu.
DataFrame.join
méthode est équivalente à la jointure SQL comme ceciSi vous souhaitez ignorer les doublons colonnes suffit de les déposer ou de sélectionner les colonnes d'intérêt par la suite. Si vous voulez vous distinguer, vous pouvez utiliser l'accès à l'aide de parent
DataFrames
:ou utiliser des alias:
Pour équi-jointures, il existe un raccourci spécial syntaxe qui prend soit une séquence de chaînes de caractères:
ou chaîne unique
qui ne conserver qu'un seul exemplaire de colonnes utilisées dans une condition de jointure.
Oui, mais uniquement par des parents qui ne sont pas avec des alias.
Comment sur une jointure externe? Toutes les lignes sans correspondance aura une valeur null dans une de la table l'une des colonnes de clé, mais vous ne savez pas à l'avance lequel de chute. Est-il un moyen de gérer ce cas de façon élégante?
et à la chute.
Dans le a rejoint dataframe, je veux le nom de la colonne que quelque chose d'autre que l'entrée de la table nom de la colonne. Est-il possible de faire cela ?. Par exemple : au Lieu d'avoir le nom de la colonne que "foo" qui est en train de "b" dataframe, je veux avoir le nom de la colonne "column_new". Quelque chose comme cette requête sql : select b.foo que column_new"
OriginalL'auteur
J'ai été coincé avec ce pour un certain temps, et tout récemment, je suis venu avec une solution de ce qui est tout à fait facile.
Dire est
et je peux faire ce pour sélectionner uniquement la valeur dans un dataframe:
Fondamentalement, il pourrait fonctionner pour toutes les colonnes.
OriginalL'auteur
Vous pouvez simplement utiliser ce
Ici le TYPE DE JOINTURE peut être
Par exemple, j'ai deux dataframes comme ceci:
Si vous ne fullouter rejoindre ensuite le résultat ressemble à ceci
OriginalL'auteur
C'est un comportement normal à partir de SQL, ce que je suis en train de faire pour cela:
Ici, je suis le remplaçant "fullname" colonne:
Un peu de code en Java:
Où la requête est:
C'est quelque chose que vous pouvez faire uniquement avec de l'Étincelle je crois (chute de la colonne de la liste), très très utile!
OriginalL'auteur