web-dev-qa-db-fra.com

Filtre de données Pyspark par colonnes d'une autre image

Je ne sais pas pourquoi j'ai du mal avec ça, cela semble si simple étant donné que c'est assez facile à faire en R ou en pandas. Je voulais éviter d'utiliser pandas cependant puisque je traite beaucoup de données, et je crois que toPandas() charge toutes les données dans la mémoire du pilote dans pyspark.

J'ai 2 cadres de données: df1 Et df2. Je veux filtrer df1 (Supprimer toutes les lignes) où df1.userid = df2.userid ET df1.group = df2.group. Je ne savais pas si je devrais utiliser filter(), join() ou sql Par exemple:

df1:
+------+----------+--------------------+
|userid|   group  |      all_picks     |
+------+----------+--------------------+
|   348|         2|[225, 2235, 2225]   |
|   567|         1|[1110, 1150]        |
|   595|         1|[1150, 1150, 1150]  |
|   580|         2|[2240, 2225]        |
|   448|         1|[1130]              |
+------+----------+--------------------+

df2:
+------+----------+---------+
|userid|   group  |   pick  |
+------+----------+---------+
|   348|         2|     2270|
|   595|         1|     2125|
+------+----------+---------+

Result I want:
+------+----------+--------------------+
|userid|   group  |      all_picks     |
+------+----------+--------------------+
|   567|         1|[1110, 1150]        |
|   580|         2|[2240, 2225]        |
|   448|         1|[1130]              |
+------+----------+--------------------+

EDIT: J'ai essayé de nombreuses fonctions join () et filter (), je crois que le plus proche que j'ai obtenu était:

cond = [df1.userid == df2.userid, df2.group == df2.group]
df1.join(df2, cond, 'left_outer').select(df1.userid, df1.group, df1.all_picks) # Result has 7 rows

J'ai essayé un tas de types de jointures différents, et j'ai également essayé différentes valeurs de cond: cond = ((df1.userid == df2.userid) & (df2.group == df2.group)) # result has 7 lignes cond = ((df1.userid! = Df2.userid) & (df2.group! = Df2.group)) # le résultat a 2 lignes

Cependant, il semble que les jointures ajoutent des lignes supplémentaires plutôt que de les supprimer.

J'utilise python 2.7 Et spark 2.1.0

21
drewyupdrew

L'anti jointure gauche est ce que vous recherchez:

df1.join(df2, ["userid", "group"], "leftanti")

mais la même chose peut être faite avec la jointure externe gauche:

(df1
    .join(df2, ["userid", "group"], "leftouter")
    .where(df2["pick"].isNull())
    .drop(df2["pick"]))
38
user6910411