Pyspark filtra il dataframe per colonne di un altro dataframe

Non sono sicuro del motivo per cui mi trovo in difficoltà con questo, sembra così semplice considerando che è abbastanza facile da fare in R o in panda. Volevo evitare di usare i panda anche se ho a che fare con molti dati, e credo che toPandas() carichi tutti i dati nella memoria del driver in pyspark.

Ho 2 dataframes: df1 e df2 . Voglio filtrare df1 (rimuovi tutte le righe) dove df1.userid = df2.userid AND df1.group = df2.group . Non ero sicuro se dovessi usare filter() , join() o sql Ad esempio:

 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: Ho provato molte funzioni di join () e filter (), credo che il più vicino che ho ottenuto sia stato:

 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 

Ho provato diversi tipi di join e ho anche provato diversi valori cond : cond = ((df1.userid == df2.userid) & (df2.group == df2.group)) # result ha 7 righe cond = ( (df1.userid! = df2.userid) & (df2.group! = df2.group)) # result ha 2 righe

Tuttavia, sembra che i join aggiungano righe aggiuntive anziché eliminarle.

Sto usando python 2.7 e spark 2.1.0

Sinistra anti join è quello che stai cercando:

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

ma la stessa cosa può essere fatta con il join esterno sinistro:

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