Comment faire une jointure externe gauche dans spark sql?
Je suis en train de faire une jointure externe gauche spark (1.6.2) et ça ne fonctionne pas. Ma requête sql est comme ceci:
sqlContext.sql("select t.type, t.uuid, p.uuid
from symptom_type t LEFT JOIN plugin p
ON t.uuid = p.uuid
where t.created_year = 2016
and p.created_year = 2016").show()
Le résultat est comme ceci:
+--------------------+--------------------+--------------------+
| type| uuid| uuid|
+--------------------+--------------------+--------------------+
| tained|89759dcc-50c0-490...|89759dcc-50c0-490...|
| swapper|740cd0d4-53ee-438...|740cd0d4-53ee-438...|
J'ai obtenu le même résultat, soit en utilisant une JOINTURE GAUCHE ou JOINTURE EXTERNE GAUCHE (la deuxième uuid n'est pas null).
J'attendrais la deuxième uuid colonne nulle. comment faire une jointure externe gauche correctement?
=== Informations complémentaires ==
Si je l'aide dataframe de faire une jointure externe gauche j'ai obtenu de bon résultat.
s = sqlCtx.sql('select * from symptom_type where created_year = 2016')
p = sqlCtx.sql('select * from plugin where created_year = 2016')
s.join(p, s.uuid == p.uuid, 'left_outer')
.select(s.type, s.uuid.alias('s_uuid'),
p.uuid.alias('p_uuid'), s.created_date, p.created_year, p.created_month).show()
J'ai obtenu le résultat comme ceci:
+-------------------+--------------------+-----------------+--------------------+------------+-------------+
| type| s_uuid| p_uuid| created_date|created_year|created_month|
+-------------------+--------------------+-----------------+--------------------+------------+-------------+
| tained|6d688688-96a4-341...| null|2016-01-28 00:27:...| null| null|
| tained|6d688688-96a4-341...| null|2016-01-28 00:27:...| null| null|
| tained|6d688688-96a4-341...| null|2016-01-28 00:27:...| null| null|
Merci,
source d'informationauteur Sean Nguyen
Vous devez vous connecter pour publier un commentaire.
Je ne vois pas de problèmes dans votre code. Les deux "left join" ou "left outer join" fonctionnera très bien. Veuillez vérifier à nouveau les données les données que vous montrer, c'est pour les matchs.
Vous pouvez également effectuer Étincelle jointure SQL en utilisant:
//Jointure externe gauche explicite
Vous êtes le filtrage des valeurs null pour
p.created_year
(et pourp.uuid
) avecLa façon de l'éviter est de déplacer le filtrage de la clause de
p
à l'instruction:C'est correct, mais inefficace, parce que nous avons aussi besoin de filtre sur
t.created_year
avant de le joindre. Il est donc recommandé d'utiliser des sous-requêtes:Je pense que vous avez juste besoin d'utiliser
LEFT OUTER JOIN
au lieu deLEFT JOIN
de mots clés pour ce que vous voulez. Pour plus d'informations oeil à la L'étincelle de la documentation.