首页 文章

Pyspark按另一个数据帧的列过滤数据帧

提问于
浏览
17

不知道为什么我在R或熊猫中相当容易做到'm having a difficult time with this, it seems so simple considering it' . 我想避免使用pandas,因为我正在处理大量数据,我相信 toPandas() 将所有数据加载到pyspark中的驱动程序内存中 .

我有2个数据帧: df1df2 . 我想过滤 df1 (删除所有行) df1.userid = df2.useriddf1.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]              |
+------+----------+--------------------+

编辑:我已经尝试了很多join()和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))#result有7行cond =( (df1.userid!= df2.userid)&(df2.group!= df2.group))#result有2行

但是,似乎联接正在添加其他行,而不是删除 .

我正在使用 python 2.7spark 2.1.0

1 回答

  • 27

    左反连接是你正在寻找的:

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

    但左外连接可以做同样的事情:

    (df1
        .join(df2, ["userid", "group"], "leftouter")
        .where(df2["pick"].isNull())
        .drop(df2["pick"]))
    

相关问题