La semplice risposta (dal Databricks FAQ on this matter) è di effettuare il join in cui il le colonne unite sono espresse come una serie di stringhe (o una stringa) anziché un predicato.
Di seguito è riportato un esempio tratto dalle Domande frequenti sui Databricks ma con due colonne di join per rispondere alla domanda del poster originale.
Ecco la sinistra dataframe:
val llist = Seq(("bob", "b", "2015-01-13", 4), ("alice", "a", "2015-04-23",10))
val left = llist.toDF("firstname","lastname","date","duration")
left.show()
/*
+---------+--------+----------+--------+
|firstname|lastname| date|duration|
+---------+--------+----------+--------+
| bob| b|2015-01-13| 4|
| alice| a|2015-04-23| 10|
+---------+--------+----------+--------+
*/
Ecco la destra dataframe:
val right = Seq(("alice", "a", 100),("bob", "b", 23)).toDF("firstname","lastname","upload")
right.show()
/*
+---------+--------+------+
|firstname|lastname|upload|
+---------+--------+------+
| alice| a| 100|
| bob| b| 23|
+---------+--------+------+
*/
Ecco un errato soluzione , dove le colonne di join sono definiti come la predicato left("firstname")===right("firstname") && left("lastname")===right("lastname")
.
Il risultato errato è che le firstname
e lastname
colonne sono duplicati nella cornice dati unita:
left.join(right, left("firstname")===right("firstname") &&
left("lastname")===right("lastname")).show
/*
+---------+--------+----------+--------+---------+--------+------+
|firstname|lastname| date|duration|firstname|lastname|upload|
+---------+--------+----------+--------+---------+--------+------+
| bob| b|2015-01-13| 4| bob| b| 23|
| alice| a|2015-04-23| 10| alice| a| 100|
+---------+--------+----------+--------+---------+--------+------+
*/
la correttezza soluzione è definire le colonne aderire come un array di stringhe Seq("firstname", "lastname")
.colonne La cornice di dati di output non dispone di duplicati:
left.join(right, Seq("firstname", "lastname")).show
/*
+---------+--------+----------+--------+------+
|firstname|lastname| date|duration|upload|
+---------+--------+----------+--------+------+
| bob| b|2015-01-13| 4| 23|
| alice| a|2015-04-23| 10| 100|
+---------+--------+----------+--------+------+
*/
Se si definiscono le colonne di join come un 'Seq' di stringhe (per i nomi di colonne), le colonne non devono essere duplicate. Vedi la mia risposta qui sotto. – stackoverflowuser2010