【问题标题】:Pyspark filter dataframe by columns of another dataframePyspark 按另一个数据框的列过滤数据框
【发布时间】:2017-06-28 03:56:21
【问题描述】:

不知道为什么我在这方面遇到困难,考虑到在 R 或 pandas 中很容易做到这一点,这似乎很简单。不过我想避免使用 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 values:
    cond = ((df1.userid == df2.userid) & (df2.group == df2.group)) # result has 7 rows
    cond = ((df1.userid != df2.userid) & (df2.group != df2.group)) # result has 2 rows

但是,连接似乎是在添加额外的行,而不是删除。

我正在使用python 2.7spark 2.1.0

【问题讨论】:

    标签: python-2.7 apache-spark dataframe pyspark apache-spark-sql


    【解决方案1】:

    左反连接就是你要找的东西:

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

    但同样的事情可以用左外连接来完成:

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

    【讨论】:

      猜你喜欢
      • 2019-03-07
      • 2018-03-08
      • 2020-11-16
      • 2019-12-21
      • 2021-09-09
      • 1970-01-01
      • 1970-01-01
      • 2018-11-12
      • 2016-10-02
      相关资源
      最近更新 更多