Pandas Pyspark-从数据帧中删除重复项,保持最后的外观

Pandas Pyspark-从数据帧中删除重复项,保持最后的外观,pandas,dataframe,pyspark,Pandas,Dataframe,Pyspark,我正在尝试重复spark数据帧,只留下最新的外观。 重复存在于三个变量中: NAME ID DOB 我在以下方面取得了成功: df_dedupe = df.drop_duplicates(subset=['NAME','ID','DOB'], keep='last', inplace=False) df_dedupe = df.dropDuplicates(['NAME', 'ID', 'DOB'], keep='last') 但在spark中,我尝试了以下方法: df_dedupe =

我正在尝试重复spark数据帧,只留下最新的外观。 重复存在于三个变量中:

NAME
ID
DOB
我在以下方面取得了成功:

df_dedupe = df.drop_duplicates(subset=['NAME','ID','DOB'], keep='last', inplace=False)
df_dedupe = df.dropDuplicates(['NAME', 'ID', 'DOB'], keep='last')
但在spark中,我尝试了以下方法:

df_dedupe = df.drop_duplicates(subset=['NAME','ID','DOB'], keep='last', inplace=False)
df_dedupe = df.dropDuplicates(['NAME', 'ID', 'DOB'], keep='last')
我得到这个错误:

TypeError: dropDuplicates() got an unexpected keyword argument 'keep'
有什么想法吗?

正如您在函数
dropDuplicates(subset=None)
的文档中所看到的,它只允许子集作为参数。如果他们都是平等的,你为什么要保留最后一个呢

编辑

正如@W-B所指出的,您需要其他列。我的解决方案是按相反顺序对原始数据帧进行排序,并在三个重复列上使用
df_dedupe
进行内部联接,只保留最后的值

df_dedupe.join(original_df,['NAME','ID','DOB'],'inner')
谢谢你的帮助。 我遵循了你的指示,但结果并不像预期的那样:

d1 = [('Bob', '10', '1542189668', '0', '0'),  ('Alice', '10', '1425298030', '154', '39'), ('Bob', '10', '1542189668', '178', '42')]
df1 = spark.createDataFrame(d1, ['NAME', 'ID', 'DOB' , 'Height' , 'ShoeSize'])
df_dedupe = df1.dropDuplicates(['NAME', 'ID', 'DOB'])
df_reverse = df1.sort((["NAME", "ID", "DOB"]), ascending= False)
df_dedupe.join(df_reverse,['NAME','ID','DOB'],'inner')
df_dedupe.show(100, False)
结果是:

+-----+---+----------+------+--------+    
|NAME |ID |DOB       |Height|ShoeSize|
+-----+---+----------+------+--------+
|Bob  |10 |1542189668|0     |0       |
|Alice|10 |1425298030|154   |39      |
+-----+---+----------+------+--------+
显示带有损坏数据的“Bob”

最后,我改变了方法,将DF转换为Pandas,然后再转换回spark:

p_schema = StructType([StructField('NAME',StringType(),True),StructField('ID',StringType(),True),StructField('DOB',StringType(),True),StructField('Height',StringType(),True),StructField('ShoeSize',StringType(),True)])
d1 = [('Bob', '10', '1542189668', '0', '0'),  ('Alice', '10', '1425298030', '154', '39'), ('Bob', '10', '1542189668', '178', '42')]
df = spark.createDataFrame(d1, p_schema)
pdf = df.toPandas()
df_dedupe = pdf.drop_duplicates(subset=['NAME','ID','DOB'], keep='last', inplace=False)

df_spark = spark.createDataFrame(df_dedupe, p_schema)
df_spark.show(100, False)
这最终带来了正确的“鲍勃”:

当然,我仍然希望有一个纯粹的Spark解决方案,但缺少索引似乎是Spark的问题


谢谢

基于[document][1]
dropDuplicates
pyspark
中没有para
keep
,因为还有其他列,他需要它们的最后一个值。我非常感谢您的代码,这对我帮助很大!我做了一个函数来做添加或更新的确切方式,你正在做它,它的工作!如果有人想让我分享,请尽管问