不知道为什么我在这个过程中遇到了困难,考虑到在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] |
+------+----------+--------------------+
编辑: 我试过很多加盟()和filter()函数,我相信我得到的最接近是:
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
值: COND =((df1.userid == df2.userid)&(df2.group == df2.group)) #结果有7行 cond =((df1.use rid!= df2.userid)&(df2.group!= df2.group))#结果有2行
但是,好像连接正在添加额外的行,而不是删除。
我使用python 2.7
和spark 2.1.0
你尝试加入吗? – eliasah
@eliasah是的,我尝试了各种各样的东西,包括连接,过滤器和sql查询。我很抱歉没有发布我的代码和我试过的东西,我知道这不公平。我之所以没有这样做,是因为我尝试了很多东西,也因为我简化了我的问题。让我编辑这个问题,并显示我已经尝试过。 – drewyupdrew