Фильтрация большого DataFrame на основе информации из маленького DataFrame - PullRequest
0 голосов
/ 10 июля 2020

У меня есть большой DataFrame с примерно 1 миллиардом строк и примерно 15 столбцами.

| country|  city | date      | ...|
+--------+-------+-----------+----+
|  France|  Paris| 2018-07-01| ...|
|   Spain| Madrid| 2017-06-01| ...|

И у меня есть DataFrame меньшего размера, который содержит даты для фильтрации на основе комбинации (страна, город) - примерно 50 строк.

| country|  city | filter_date |
+--------+-------+-------------+
|  France|  Paris| 2018-07-01  |
|   Spain| Madrid| 2017-06-01  |

Я хотел бы отфильтровать большой DataFrame по дате, используя filter_date, хранящийся в маленьком DataFrame для данной комбинации - например, удалить все строки, которые содержат (Франция, Париж) и находятся перед the 2018-07-01, et c ...

Решение, которое я изначально имел в виду, заключалось в том, чтобы просто выполнить левое соединение, а затем отфильтровать, например:

df = df_large.join(df_small, on=['country', 'city'], how='left').filter(f.col('date') >= c.col('filter_date'))

Однако это решение не идеально, поскольку левое соединение очень дорогое, а мой DataFrame слишком большой. При выполнении действия после этой операции выполнение кода занимает очень много времени.

1 Ответ

1 голос
/ 10 июля 2020

Попробуйте left semi join + broadcasting меньший df. Также объедините все фильтры, используя and, как показано ниже -

 df_large.join(broadcast(df_small), df_large("country") === df_small("country") &&
      df_large("city") === df_small("city") && df_large("date") >= df_small("filter_date"), "leftsemi")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...