Pyspark:如何仅删除少数列的dropduplicates中的两个事件

我正在为此使用pysaprk:

在应用dropduplicates时,我想删除匹配行的所有出现。

数据集:

public class SpaceItem: NSManagedObject,Identifiable {
    @NSManaged public var name:String?
    @NSManaged public override var describe: String?
    @NSManaged public override var imagename: String?
 }

我需要什么:

+----+----+----+
|col1|col2|col3|
+----+----+----+
|   1|   1|   A|
|   1|   1|   A|
|   2|   1|   C|
|   1|   2|   D|
|   3|   5|   E|
|   3|   5|   E|
|   4|   3|   G|
+----+----+----+

我尝试使用唯一性,但唯一性适用于所有列。

+----+----+----+ |col1|col2|col3| +----+----+----+ | 2| 1| C| | 1| 2| D| | 4| 3| G| +----+----+----+

xu414816349 回答:Pyspark:如何仅删除少数列的dropduplicates中的两个事件

这不是一种优雅的方法,但是可以提供一个想法

>>> df = spark.createDataFrame([(1,25),(1,20),(2,26)],['id','age'])

>>> df.show()
+---+---+
| id|age|
+---+---+
|  1| 25|
|  1| 20|
|  1| 20|
|  2| 26|
+---+---+

>>> df.groupBy([c for c in df.columns]).agg(count('id').alias('c')).show()
+---+---+---+
| id|age|  c|
+---+---+---+
|  1| 25|  1|
|  1| 20|  2|
|  2| 26|  1|
+---+---+---+

>>> df.groupBy([c for c in df.columns]).agg(count('id').alias('c')).filter('c=1').show()
+---+---+---+
| id|age|  c|
+---+---+---+
|  1| 25|  1|
|  2| 26|  1|
+---+---+---+
,
  

您可以使用Window函数来避免多次时间聚合,这是代码段。

from pyspark.sql.window import Window
import pyspark.sql.functions as f
df = spark.createDataFrame([(1,'age'])
df.withColumn("test",f.count("*").over(Window.partitionBy("id","age").orderBy("id","age"))).filter(f.col("test")==1).show()
+---+---+----+                                                                  
| id|age|test|
+---+---+----+
|  1| 25|   1|
|  2| 26|   1|
+---+---+----+

如果您对此有任何疑问,请告诉我。

,

我认为可以通过完全外部联接并提供列列表然后将其过滤掉来实现。

diff_df = source_df.join(target_df,columns_list,how='full')

过滤器:

diff_df.filter(diff_df.col3.isNull() | diff_df.col3.isNull())
本文链接:https://www.f2er.com/3102476.html

大家都在问