Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 Pyspark按另一个数据帧的列筛选数据帧_Python 2.7_Apache Spark_Dataframe_Pyspark_Apache Spark Sql - Fatal编程技术网

Python 2.7 Pyspark按另一个数据帧的列筛选数据帧

Python 2.7 Pyspark按另一个数据帧的列筛选数据帧,python-2.7,apache-spark,dataframe,pyspark,apache-spark-sql,Python 2.7,Apache Spark,Dataframe,Pyspark,Apache Spark Sql,不知道为什么我在这方面遇到了困难,考虑到在R或pandas中做这件事相当容易,它看起来很简单。但是我想避免使用pandas,因为我要处理大量数据,我相信toPandas()会将所有数据加载到pyspark中的驱动程序内存中 我有两个数据帧:df1和df2。我想筛选df1(删除所有行),其中df1.userid=df2.userid和df1.group=df2.group。我不确定是否应该使用filter(),join(),或sql,例如: df1: +------+----------+----

不知道为什么我在这方面遇到了困难,考虑到在R或pandas中做这件事相当容易,它看起来很简单。但是我想避免使用pandas,因为我要处理大量数据,我相信
toPandas()
会将所有数据加载到pyspark中的驱动程序内存中

我有两个数据帧:
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]              |
+------+----------+--------------------+
编辑: 我已经尝试了许多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))#结果有7行 cond=((df1.userid!=df2.userid)&(df2.group!=df2.group))#结果有两行

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


我使用的是
python 2.7
spark 2.1.0

您需要的是左反连接:

df1.join(df2, ["userid", "group"], "leftanti")
但同样的事情也可以通过左外连接完成:

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