2017-02-09 2 views
4

Не уверен, почему у меня с этим трудное время, кажется, это так просто, потому что это довольно легко сделать в R или пандах. Я хотел избежать использования панд, хотя, поскольку я имею дело с большим количеством данных, и я считаю, что toPandas() загружает все данные в память водителя в pyspark.Паттерн данных фильтра Pyspark по столбцам другого информационного кадра

У меня есть 2 блока данных: df1 и df2. Я хочу фильтровать df1 (удалить все строки), где df1.userid = df2.userid И df1.group = df2.group. Я не был уверен, если я должен использовать filter(), join() или sql Например:

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: Я пробовал много присоединиться() и фильтр() функции, я считаю, что ближе я получил:

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 

Я перепробовал кучу разных типов присоединиться, и я также пробовал различные cond значения: конд = ((df1.userid == df2.userid) & (df2.group == df2.group)) # result имеет 7 строк cond = ((df1.userid! = df2.u serid) & (df2.group! = df2.group)) # result имеет 2 ряда

Однако похоже, что соединения добавляют дополнительные строки, а не удаляют.

Я использую python 2.7 и spark 2.1.0

+0

Вы попробовали присоединиться? – eliasah

+0

@eliasah Да, я пробовал всевозможные вещи, включая соединения, фильтрацию и sql-запросы. Я прошу прощения за то, что не отправлял мой код и что я пытался, я знаю, что это несправедливо. Причина, почему я этого не сделал, потому что я пробовал так много вещей, а также потому, что упростил свой вопрос. Позвольте мне изменить вопрос и показать, что я пробовал. – drewyupdrew

ответ

8

Левые против присоединиться является то, что вы ищете:

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

, но то же самое можно сделать с помощью левого внешнего соединения:

(df1 
    .join(df2, ["userid", "group"], "leftouter") 
    .where(df2["pick"].isNull()) 
    .drop(df2["pick"])) 
Смежные вопросы