Python 根据小数据帧中的信息过滤大数据帧
我有一个大约10亿行和15列的大型数据框Python 根据小数据帧中的信息过滤大数据帧,python,dataframe,pyspark,Python,Dataframe,Pyspark,我有一个大约10亿行和15列的大型数据框 | country| city | date | ...| +--------+-------+-----------+----+ | France| Paris| 2018-07-01| ...| | Spain| Madrid| 2017-06-01| ...| 我有一个较小的数据框,其中包含根据组合(国家、城市)筛选的日期,大约50行 | country| city | filter_date | +--------+---
| country| city | date | ...|
+--------+-------+-----------+----+
| France| Paris| 2018-07-01| ...|
| Spain| Madrid| 2017-06-01| ...|
我有一个较小的数据框,其中包含根据组合(国家、城市)筛选的日期,大约50行
| country| city | filter_date |
+--------+-------+-------------+
| France| Paris| 2018-07-01 |
| Spain| Madrid| 2017-06-01 |
我想使用存储在给定组合的小数据框中的筛选器_日期按日期筛选大数据框-例如,删除包含(法国、巴黎)且在2018-07-01之前的任何行,等等
我最初想到的解决方案只是进行左连接,然后进行过滤,例如:
df = df_large.join(df_small, on=['country', 'city'], how='left').filter(f.col('date') >= c.col('filter_date'))
但是这个解决方案并不理想,因为左连接非常昂贵,而且我的数据帧太大。执行此操作后执行操作时,代码需要很长时间才能运行。尝试
左半部分
加入+广播
较小的df。还可以使用和
组合所有过滤器,如下所示-
df_large.join(广播(df_small),df_large(“国家”)==df_small(“国家”)&&
df_large(“城市”)==df_small(“城市”)和&df_large(“日期”)>=df_small(“筛选日期”),“leftsemi”)
我相信它应该只有2个等于'=='而不是'==',对吗?在pyspark中是的,就像一样。join(department,people.deptId==department.id)
其中people和department是dfs==返回一个布尔值===返回一列(其中包含两列元素的比较结果)