Pyspark - удаляет дубликаты с датафрейма, сохраняя последний вид - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь дедуплицировать искровой фрейм данных, оставляя только последнее появление.Дублирование состоит из трех переменных:

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')

Я получаю эту ошибку:

TypeError: dropDuplicates() got an unexpected keyword argument 'keep'

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Спасибо за вашу помощь.Я следовал вашим указаниям, но результат оказался не таким, как ожидалось:

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      |
+-----+---+----------+------+--------+

Показ «Боба» с поврежденными данными.

НаконецЯ изменил свой подход и преобразовал DF в Pandas, а затем вернулся к искре:

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)

Это, наконец, принесло правильный "Боб":

+-----+---+----------+------+--------+
|NAME |ID |DOB       |Height|ShoeSize|
+-----+---+----------+------+--------+
|Alice|10 |1425298030|154   |39      |
|Bob  |10 |1542189668|178   |42      |
+-----+---+----------+------+--------+

Конечно, я бывсе еще хотелось бы иметь чисто Spark-решение, но отсутствие индексации кажется проблематичным для Spark.

Спасибо!

0 голосов
/ 13 ноября 2018

Как видно из http://spark.apache.org/docs/2.1.0/api/python/pyspark.sql.html документации по функции dropDuplicates(subset=None), в качестве параметра допускается только подмножество .Зачем вам сохранять последние, если они все равны?

РЕДАКТИРОВАТЬ

Как указано @WB, вам нужны другие столбцы.Мое решение состоит в том, чтобы отсортировать исходный кадр данных в обратном порядке и использовать df_dedupe в трех повторяющихся столбцах для создания внутреннего соединения и сохранения только последних значений.

df_dedupe.join(original_df,['NAME','ID','DOB'],'inner')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...