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
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"]))