web-dev-qa-db-fra.com

Comment faire une jointure externe gauche spark sql?

J'essaie de faire une jointure externe gauche dans spark (1.6.2) et cela 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 ça:

+--------------------+--------------------+--------------------+
|                type|                uuid|                uuid|
+--------------------+--------------------+--------------------+
|              tained|89759dcc-50c0-490...|89759dcc-50c0-490...|
|             swapper|740cd0d4-53ee-438...|740cd0d4-53ee-438...|

J'ai eu le même résultat en utilisant LEFT JOIN ou LEFT OUTER JOIN (le deuxième uuid n'est pas nul).

Je m'attendrais à ce que la deuxième colonne uuid soit nulle uniquement. Comment faire une jointure externe gauche correctement?

=== Informations complémentaires ==

Si j'utilise dataframe pour faire une jointure externe gauche, j'ai obtenu un résultat correct.

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 un résultat comme ça:

+-------------------+--------------------+-----------------+--------------------+------------+-------------+
|               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,

21
Sean Nguyen

Je ne vois pas de problèmes dans votre code. Les deux "jointure gauche" ou "jointure externe gauche" fonctionneront bien. Veuillez vérifier à nouveau les données. Les données que vous affichez sont destinées à des correspondances.

Vous pouvez également effectuer Spark rejoindre SQL en utilisant:

// jointure externe gauche explicite

df1.join(df2, df1("col1") === df2("col1"), "left_outer")
32
Arvind Kumar

Vous filtrez les valeurs nulles pour p.created_year (et pour p.uuid) avec

where t.created_year = 2016 
and p.created_year = 2016

Pour éviter cela, déplacez la clause de filtrage pour p vers l'instruction ON:

sqlContext.sql("select t.type, t.uuid, p.uuid
from symptom_type t LEFT JOIN plugin p 
ON t.uuid = p.uuid 
and p.created_year = 2016
where t.created_year = 2016").show()

Ceci est correct mais inefficace car nous devons également filtrer sur t.created_year avant que la jointure ne se produise. Il est donc recommandé d'utiliser des sous-requêtes:

sqlContext.sql("select t.type, t.uuid, p.uuid
from (
  SELECT type, uuid FROM symptom_type WHERE created_year = 2016 
) t LEFT JOIN (
  SELECT uuid FROM plugin WHERE created_year = 2016
) p 
ON t.uuid = p.uuid").show()    
4
Ivan Medvedev

Je pense que vous avez juste besoin d'utiliser LEFT OUTER JOIN au lieu de LEFT JOIN mot-clé pour ce que vous voulez. Pour plus d'informations, consultez le documentation Spark .

2
beljul