web-dev-qa-db-fra.com

Joindre deux cadres de données, sélectionner toutes les colonnes de l’un et certaines colonnes de l’autre

Supposons que j'ai un cadre de données spark, df1, avec plusieurs colonnes (dont la colonne 'id') et un cadre de données df2 avec deux colonnes, 'id' et 'other'.

Est-il possible de répliquer la commande suivante

sqlContext.sql("SELECT df1.*, df2.other FROM df1 JOIN df2 ON df1.id = df2.id")

en utilisant uniquement les fonctions pyspark telles que join (), select () et autres?

Je dois implémenter cette jointure dans une fonction et je ne veux pas être obligé d'avoir sqlContext en tant que paramètre de fonction.

Merci!

47
Francesco Sambo

Pas sûr si le moyen le plus efficace, mais cela a fonctionné pour moi:

from pyspark.sql.functions import col

df1.alias('a').join(df2.alias('b'),col('b.id') == col('a.id')).select([col('a.'+xx) for xx in a.columns] + [col('b.other1'),col('b.other2')])

Le truc est dans:

[col('a.'+xx) for xx in a.columns] : all columns in a

[col('b.other1'),col('b.other2')] : some columns of b
47
Pablo Estevez

L'astérisque (*) fonctionne avec un alias. Ex:

from pyspark.sql.functions import *

df1 = df.alias('df1')
df2 = df.alias('df2')

df1.join(df2, df1.id == df2.id).select('df1.*')
45
maxcnunes

sans utiliser alias.

df1.join(df2, df1.id == df2.id).select(df1["*"],df2["other"])
12

Voici une solution qui ne nécessite pas de contexte SQL, mais maintient les métadonnées d'un DataFrame.

a = sc.parallelize([['a', 'foo'], ['b', 'hem'], ['c', 'haw']]).toDF(['a_id', 'extra'])
b = sc.parallelize([['p1', 'a'], ['p2', 'b'], ['p3', 'c']]).toDF(["other", "b_id"])

c = a.join(b, a.a_id == b.b_id)

Ensuite, c.show() donne:

+----+-----+-----+----+
|a_id|extra|other|b_id|
+----+-----+-----+----+
|   a|  foo|   p1|   a|
|   b|  hem|   p2|   b|
|   c|  haw|   p3|   c|
+----+-----+-----+----+
9
Katya Handler

supprimer les doublons b_id

c = a.join(b, a.a_id == b.b_id).drop(b.b_id)
3
Selvaraj S.

Vous pouvez simplement faire la jointure et ensuite sélectionner les colonnes souhaitées https://spark.Apache.org/docs/latest/api/python/pyspark.sql.html?highlight=dataframe%20join#pyspark.sql .DataFrame.join

0
Erica

J'ai eu une erreur: 'a not found' en utilisant le code suggéré:

from pyspark.sql.functions import col df1.alias('a').join(df2.alias('b'),col('b.id') == col('a.id')).select([col('a.'+xx) for xx in a.columns] + [col('b.other1'),col('b.other2')])

J'ai changé a.columns en df1.columns et cela a fonctionné.

0
filip stepniak