当前位置:  开发笔记 > 数据库 > 正文

使用pyspark分组By,Rank和聚合火花数据框

如何解决《使用pyspark分组By,Rank和聚合火花数据框》经验,为你挑选了1个好方法。

我有一个看起来像这样的数据框:

A     B    C
---------------
A1    B1   0.8
A1    B2   0.55
A1    B3   0.43

A2    B1   0.7
A2    B2   0.5
A2    B3   0.5

A3    B1   0.2
A3    B2   0.3
A3    B3   0.4

如何将列'C'转换为每列A的相对等级(更高的分数 - >更好的等级)?预期产出:

A     B    Rank
---------------
A1    B1   1
A1    B2   2
A1    B3   3

A2    B1   1
A2    B2   2
A2    B3   2

A3    B1   3
A3    B2   2
A3    B3   1

我想要达到的最终状态是聚合列B并存储每个A的等级:

例:

B    Ranks
B1   [1,1,3]
B2   [2,2,2]
B3   [3,2,1]

user7337271.. 24

添加排名:

from pyspark.sql.functions import *
from pyspark.sql.window import Window

ranked =  df.withColumn(
  "rank", dense_rank().over(Window.partitionBy("A").orderBy(desc("C"))))

通过...分组:

grouped = ranked.groupBy("B").agg(collect_list(struct("A", "rank")).alias("tmp"))

排序并选择:

grouped.select("B", sort_array("tmp")["rank"].alias("ranks"))

使用Spark 2.1.0进行测试.



1> user7337271..:

添加排名:

from pyspark.sql.functions import *
from pyspark.sql.window import Window

ranked =  df.withColumn(
  "rank", dense_rank().over(Window.partitionBy("A").orderBy(desc("C"))))

通过...分组:

grouped = ranked.groupBy("B").agg(collect_list(struct("A", "rank")).alias("tmp"))

排序并选择:

grouped.select("B", sort_array("tmp")["rank"].alias("ranks"))

使用Spark 2.1.0进行测试.

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有