Удаление дубликатов из фрейма данных в PySpark

Я возился с фреймами данных в pyspark 1.4 локально, и у меня проблемы с работой метода dropDuplicates. Он продолжает возвращать ошибку:

AttributeError: объект 'list' не имеет атрибута 'dropDuplicates'

Не совсем уверен, почему, поскольку я, кажется, следую синтаксису в последняя версия документации.

#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()

person Jared    schedule 26.06.2015    source источник


Ответы (2)


Это не проблема импорта. Вы просто вызываете .dropDuplicates() не на тот объект. Хотя класс sqlContext.createDataFrame(rdd1, ...) равен pyspark.sql.dataframe.DataFrame, после применения .collect() это будет простой Python list, а списки не предоставляют dropDuplicates метод. Вам нужно что-то вроде этого:

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

 df1.collect()
person zero323    schedule 26.06.2015

если у вас есть фрейм данных и вы хотите удалить все дубликаты - со ссылкой на дубликаты в определенном столбце (называемом 'colName'):

считать до дедупликации:

df.count()

выполните дедупликацию (преобразуйте столбец, который вы де-дублируете, в строковый тип):

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

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

можно использовать отсортированную группу, чтобы проверить, были ли удалены дубликаты:

df.groupBy('colName').count().toPandas().set_index("count").sort_index(ascending=False)
person Grant Shannon    schedule 02.01.2018