2017-02-09 4 views
4

Nicht sicher, warum ich eine schwierige Zeit mit diesem habe, scheint es so einfach, wenn man bedenkt, es ist ziemlich einfach in R oder Pandas zu tun. Ich wollte jedoch Pandas vermeiden, da ich mit vielen Daten zu tun habe, und ich glaube, toPandas() lädt alle Daten in den Speicher des Treibers in pyspark.Pyspark-Filter Datenrahmen von Spalten eines anderen Datenrahmens

Ich habe 2 Datenrahmen: df1 und df2. Ich möchte df1 filtern (alle Zeilen entfernen), wobei df1.userid = df2.userid AND df1.group = df2.group. Ich war nicht sicher, ob ich filter(), join() oder sql Zum Beispiel verwenden soll:

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: Ich habe versucht, viele join() und filter() Funktionen, ich glaube, die nächste, die ich bekam, war:

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 

ich habe versucht, eine Reihe von verschiedenen Arten kommen, und ich habe auch versucht, verschiedene cond Werte: cond = ((df1.userid == df2.userid) & (df2.group == df2.group)) # Ergebnis hat 7 Zeilen cond = ((df1.use rid! = df2.userid) & (df2.group! = df2.group)) # Ergebnis hat 2 Zeilen

Es scheint jedoch so, als würden die Joins zusätzliche Zeilen hinzufügen, anstatt zu löschen.

Ich verwende python 2.7 und spark 2.1.0

+0

Haben Sie versucht, beitreten? – eliasah

+0

@eliasah Ja, ich habe alle möglichen Dinge versucht, einschließlich Join, Filter und SQL-Abfragen. Ich entschuldige mich dafür, dass ich meinen Code nicht gepostet habe und was ich versucht habe, ich weiß, das ist nicht fair. Der Grund, warum ich das nicht getan habe, ist, weil ich so viele Dinge ausprobiert habe, und auch, weil ich meine Frage vereinfacht habe. Lassen Sie mich die Frage bearbeiten und zeigen, was ich versucht habe. – drewyupdrew

Antwort

8

Linke anti verbinden ist das, was Sie suchen:

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

aber das gleiche kann mit der linken äußeren erfolgen verbinden:

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