从 PySpark 中的数据框中删除重复项
Remove duplicates from a dataframe in PySpark
我在本地处理 pyspark 1.4 中的数据帧,并且在使 dropDuplicates
方法起作用时遇到问题。它不断返回错误:
"AttributeError: 'list' object has no attribute '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()
这不是导入问题。您只需在错误的对象上调用 .dropDuplicates()
。虽然 sqlContext.createDataFrame(rdd1, ...)
的 class 是 pyspark.sql.dataframe.DataFrame
,但在您应用 .collect()
后,它是一个普通的 Python list
,并且列表不提供 dropDuplicates
方法。你想要的是这样的:
(df1 = sqlContext
.createDataFrame(rdd1, ['column1', 'column2', 'column3', 'column4'])
.dropDuplicates())
df1.collect()
如果您有一个数据框并希望删除所有重复项——参考特定列中的重复项(称为 'colName'):
去重前计数:
df.count()
进行重复数据删除(将要进行重复数据删除的列转换为字符串类型):
from pyspark.sql.functions import col
df = df.withColumn('colName',col('colName').cast('string'))
df.drop_duplicates(subset=['colName']).count()
可以使用排序的 groupby 检查是否已删除重复项:
df.groupBy('colName').count().toPandas().set_index("count").sort_index(ascending=False)
我在本地处理 pyspark 1.4 中的数据帧,并且在使 dropDuplicates
方法起作用时遇到问题。它不断返回错误:
"AttributeError: 'list' object has no attribute '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()
这不是导入问题。您只需在错误的对象上调用 .dropDuplicates()
。虽然 sqlContext.createDataFrame(rdd1, ...)
的 class 是 pyspark.sql.dataframe.DataFrame
,但在您应用 .collect()
后,它是一个普通的 Python list
,并且列表不提供 dropDuplicates
方法。你想要的是这样的:
(df1 = sqlContext
.createDataFrame(rdd1, ['column1', 'column2', 'column3', 'column4'])
.dropDuplicates())
df1.collect()
如果您有一个数据框并希望删除所有重复项——参考特定列中的重复项(称为 'colName'):
去重前计数:
df.count()
进行重复数据删除(将要进行重复数据删除的列转换为字符串类型):
from pyspark.sql.functions import col
df = df.withColumn('colName',col('colName').cast('string'))
df.drop_duplicates(subset=['colName']).count()
可以使用排序的 groupby 检查是否已删除重复项:
df.groupBy('colName').count().toPandas().set_index("count").sort_index(ascending=False)