python 2.7 - technology - Marco de datos de filtro Pyspark por columnas de otro marco de datos
spark technology (1)
Left anti join es lo que estás buscando:
df1.join(df2, ["userid", "group"], "leftanti")
pero lo mismo se puede hacer con la unión externa izquierda:
(df1
.join(df2, ["userid", "group"], "leftouter")
.where(df2["pick"].isNull())
.drop(df2["pick"]))
No estoy seguro de por qué estoy teniendo un momento difícil con esto, parece tan simple teniendo en cuenta que es bastante fácil de hacer en R o pandas.
Sin embargo, quería evitar el uso de pandas ya que estoy lidiando con una gran cantidad de datos, y creo que
toPandas()
carga todos los datos en la memoria del controlador en pyspark.
Tengo 2 marcos de datos:
df1
y
df2
.
Quiero filtrar
df1
(eliminar todas las filas) donde
df1.userid = df2.userid
AND
df1.group = df2.group
.
No estaba seguro de si debería usar
filter()
,
join()
o
sql
Por ejemplo:
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] |
+------+----------+--------------------+
EDITAR: He intentado muchas funciones join () y filter (), creo que lo más cercano que tuve fue:
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
Probé un montón de diferentes tipos de unión, y también probé diferentes valores
cond
: cond = ((df1.userid == df2.userid) & (df2.group == df2.group)) # result tiene 7 filas cond = ( (df1.userid! = df2.userid) & (df2.group! = df2.group)) # resultado tiene 2 filas
Sin embargo, parece que las combinaciones están agregando filas adicionales, en lugar de eliminar.
Estoy usando
python 2.7
y
spark 2.1.0