PySpark窗口功能内的高级过滤(关于效率)

时间:2020-02-27 11:06:48

标签: performance filter pyspark pyspark-sql

注意:欢迎对标题进行改进

我需要对数据框执行过滤,但结果不能包含重复项。在下一节中,我将简要简要地解释该问题。

简短的问题:
我有以下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|
+-----+-------+----+-----------+

我需要对大量的Pages执行此操作,因此我正在寻找一种在Pyspark中执行此操作的有效方法。

我尝试过的事情
我的第一次尝试是首先对数据帧进行排序(升序),然后对CountOfRank(降序)进行排序。然后,通过删除每个['page','rank']的重复项(从上到下),我最终获得了每个等级的最佳文章。但是,这不会阻止重复的文章出现在理想的排名中。
我尝试的另一个选择是先删除每个['Page','Article']的重复项,然后选择每个Rank的第一行。但是,这不能确保选择每个等级的最佳文章,因为它们可能已被删除。

0 个答案:

没有答案