Примечание. Усовершенствования в заголовке приветствуются.
Мне нужно выполнить фильтр для кадра данных, но результат не может содержать дубликаты. Я постараюсь объяснить проблему кратко, но кратко в следующем разделе.
Проблема вкратце:
У меня есть следующий фрейм данных pyspark:
Page = [H,H,H,H,H,H,H,H,H]
Article = [A,B,C,A,B,C,D,C,B]
Rank = [1,1,1,2,2,2,3,3,3]
CountOfRank = [50,30,10,40,30,10,40,30,20]
df = spark.createDataFrame(pd.DataFrame([Page,Article,Rank,CountOfRank]).T, schema=['Page','Article', 'Rank','CountOfRank'])
df.show()
+-----+-------+----+-----------+
| Page|Article|Rank|CountOfRank|
+-----+-------+----+-----------+
| H| A| 1| 50|
| H| B| 1| 30|
| H| C| 1| 10|
| H| A| 2| 40|
| H| B| 2| 30|
| H| C| 2| 10|
| H| D| 3| 40|
| H| B| 3| 30|
| H| E| 3| 20|
+-----+-------+----+-----------+
Мне нужно получить список статей, которые видны больше всего на каждом уровне. То есть статья с самым высоким CountOfRank в каждом ранге. Тем не менее, статьи могут занимать только один рейтинг, поэтому, когда статья была наиболее заметной статьей за ранг 1, этой конкретной статье нельзя было присвоить какой-либо рейтинг «ниже / хуже». Вывод для примера должен выглядеть следующим образом:
+-----+-------+----+-----------+
|Group|Article|Rank|CountOfRank|
+-----+-------+----+-----------+
| H| A| 1| 50|
| H| B| 2| 30|
| H| D| 3| 40|
+-----+-------+----+-----------+
Мне нужно выполнить это действие для огромного количества страниц, поэтому я ищу эффективный способ сделать это в Pyspark.
То, что я пытался
Моя первая попытка состояла в том, чтобы отсортировать фрейм данных сначала по рангу (по возрастанию), а затем по CountOfRank (по убыванию). Затем, удалив дубликаты (сверху вниз) по ['page', 'rank'], я получаю лучшую статью по рангу. Однако это не препятствует появлению дубликатов статей в идеальном ранге.
Другой вариант, который я пробовал, - сначала удалить дубликаты для ['Page', 'Article'], а затем выбрать первую строку для каждого ранга. Однако это не гарантирует, что будут выбраны лучшие статьи на ранг, поскольку они могли быть удалены.