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 PySpark:使用isin进行过滤返回空数据帧_Python_Apache Spark_Pyspark_Apache Spark Sql_Pyspark Sql - Fatal编程技术网

Python PySpark:使用isin进行过滤返回空数据帧

Python PySpark:使用isin进行过滤返回空数据帧,python,apache-spark,pyspark,apache-spark-sql,pyspark-sql,Python,Apache Spark,Pyspark,Apache Spark Sql,Pyspark Sql,上下文: 我需要使用isin函数根据包含另一个数据帧列的内容过滤数据帧 对于使用pandas的Python用户,这将是:isin()。 对于R用户,这将是:%in% 因此,我有一个简单的spark数据框,其中包含id和value列: l = [(1, 12), (1, 44), (1, 3), (2, 54), (3, 18), (3, 11), (4, 13), (5, 78)] df = spark.createDataFrame(l, ['id', 'value']) df.show()

上下文: 我需要使用isin函数根据包含另一个数据帧列的内容过滤数据帧

对于使用pandas的Python用户,这将是:isin()。
对于R用户,这将是:%in%

因此,我有一个简单的spark数据框,其中包含idvalue列:

l = [(1, 12), (1, 44), (1, 3), (2, 54), (3, 18), (3, 11), (4, 13), (5, 78)]
df = spark.createDataFrame(l, ['id', 'value'])
df.show()

+---+-----+
| id|value|
+---+-----+
|  1|   12|
|  1|   44|
|  1|    3|
|  2|   54|
|  3|   18|
|  3|   11|
|  4|   13|
|  5|   78|
+---+-----+
我想获得所有多次出现的ID。以下是df中唯一ID的数据帧:

unique_ids = df.groupBy('id').count().where(col('count') < 2)
unique_ids.show()

+---+-----+
| id|count|
+---+-----+
|  5|    1|
|  2|    1|
|  4|    1|
+---+-----+
但是,我得到一个空数据帧:

df.show()

+---+-----+
| id|value|
+---+-----+
+---+-----+ 
此“错误”的工作方式与此相反:

df[df.id.isin(unique_ids.id)]

返回df的所有行。

表达式
df.id.isin(unique_ids.id)=False
正在计算是否
,这永远不会发生,因为id在id中。但是,表达式
df.id.isin(unique_ids.id)
正在计算是否
,这始终是真的,因此,它返回整个数据帧
unique_id.id
是一列而不是列表

isin(*cols)
将值列表作为参数而不是列接收,因此,要以这种方式工作,应执行以下操作:

ids = unique_ids.rdd.map(lambda x:x.id).collect()
df[df.id.isin(ids)].collect() # or show...
您将获得:

[Row(id=2, value=54), Row(id=4, value=13), Row(id=5, value=78)]
在任何情况下,我认为最好将两个数据帧连接起来:

df_ = df.join(unique_ids, on='id')
获取:

df_.show()
+---+-----+-----+
| id|value|count|
+---+-----+-----+
|  5|   78|    1|
|  2|   54|    1|
|  4|   13|    1|
+---+-----+-----+

不要在此处使用
isin
-使用
join
。例如:
df.join(unique_id,on=“id”).show()
。您只能将
isin
与文字值一起使用(例如:
df.where(df[“id”].isin([1,2,3])
),而不能与列一起使用。相关的/可能的重复项:,“我认为会更好”->会更好。在这种情况下,为了满足我的需要,我将df与非唯一id列表一起使用。好吧,我的错误,因此,在join-how参数中,您必须指定一个
how='left\u-anti'
join:
df\uu=df.join(唯一的id,on='id',how='left\u-anti')
,默认情况下
how='inner'
谢谢,这也是我遇到的问题。正如您所说,我希望当您输入一个列时,它会(逻辑上)输入列值。。
df_.show()
+---+-----+-----+
| id|value|count|
+---+-----+-----+
|  5|   78|    1|
|  2|   54|    1|
|  4|   13|    1|
+---+-----+-----+