【问题标题】:Group By, Rank and aggregate spark data frame using pyspark使用 pyspark 分组、排序和聚合 spark 数据帧
【发布时间】:2017-05-30 09:17:35
【问题描述】:

我有一个如下所示的数据框:

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]

【问题讨论】:

    标签: apache-spark pyspark spark-dataframe


    【解决方案1】:

    添加排名:

    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 测试。

    【讨论】:

    • 收藏按钮在哪里?
    【解决方案2】:
    windowSpec = Window.partitionBy("col1").orderBy("col2")
    ranked = demand.withColumn("col_rank", row_number().over(windowSpec))
    ranked.show(1000)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-06
      • 2020-06-10
      • 2018-09-03
      相关资源
      最近更新 更多