tutorial technology sparkapache spark science descargar data big python-2.7 apache-spark dataframe pyspark apache-spark-sql

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