Расширенная фильтрация в оконных функциях PySpark (с точки зрения эффективности) - PullRequest
0 голосов
/ 27 февраля 2020

Примечание. Усовершенствования в заголовке приветствуются.

Мне нужно выполнить фильтр для кадра данных, но результат не может содержать дубликаты. Я постараюсь объяснить проблему кратко, но кратко в следующем разделе.

Проблема вкратце:
У меня есть следующий фрейм данных 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'], а затем выбрать первую строку для каждого ранга. Однако это не гарантирует, что будут выбраны лучшие статьи на ранг, поскольку они могли быть удалены.

...