从 PySpark 中的数据框中删除重复项

Posted

技术标签:

【中文标题】从 PySpark 中的数据框中删除重复项【英文标题】:Remove duplicates from a dataframe in PySpark 【发布时间】:2015-06-26 03:08:28 【问题描述】:

我在本地处理 pyspark 1.4 中的数据帧,并且在使 dropDuplicates 方法工作时遇到问题。它不断返回错误:

"AttributeError: 'list' 对象没有属性 'dropDuplicates'"

不太清楚为什么,因为我似乎遵循latest documentation 中的语法。

#loading the CSV file into an RDD in order to start working with the data
rdd1 = sc.textFile("C:\myfilename.csv").map(lambda line: (line.split(",")[0], line.split(",")[1], line.split(",")[2], line.split(",")[3])).collect()

#loading the RDD object into a dataframe and assigning column names
df1 = sqlContext.createDataFrame(rdd1, ['column1', 'column2', 'column3', 'column4']).collect()

#dropping duplicates from the dataframe
df1.dropDuplicates().show()

【问题讨论】:

【参考方案1】:

这不是进口问题。您只需在错误的对象上调用.dropDuplicates()。虽然sqlContext.createDataFrame(rdd1, ...) 的类是pyspark.sql.dataframe.DataFrame,但在您应用.collect() 之后,它是一个普通的Python list,并且列表不提供dropDuplicates 方法。你想要的是这样的:

 (df1 = sqlContext
     .createDataFrame(rdd1, ['column1', 'column2', 'column3', 'column4'])
     .dropDuplicates())

 df1.collect()

【讨论】:

【参考方案2】:

如果您有一个数据框并希望删除所有重复项——参考特定列中的重复项(称为“colName”):

重复数据删除前的计数:

df.count()

进行重复数据删除(将要重复数据删除的列转换为字符串类型):

from pyspark.sql.functions import col
df = df.withColumn('colName',col('colName').cast('string'))

df.drop_duplicates(subset=['colName']).count()

可以使用 sorted groupby 来检查是否已删除重复项:

df.groupBy('colName').count().toPandas().set_index("count").sort_index(ascending=False)

【讨论】:

以上是关于从 PySpark 中的数据框中删除重复项的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark - 从数据框中删除重复项,保持最后一次出现

在 pyspark 数据框中使用 write.partitionBy 时如何删除重复项?

删除 pyspark 中的所有重复实例

Pyspark 数据框删除 AWS Glue 脚本中的重复项

如何从 PySpark Dataframe 中删除重复项并将剩余列值更改为 null

如何删除列之间的重复值,而不管它们在 python 或 pyspark 中的顺序如何?