首页 > 数据库 > mysql教程 > 如何高效地选择 Spark DataFrame 中每组中具有最高值的第一行?

如何高效地选择 Spark DataFrame 中每组中具有最高值的第一行?

Susan Sarandon
发布: 2025-01-23 13:02:16
原创
746 人浏览过

How to Efficiently Select the First Row of Each Group with the Highest Value in a Spark DataFrame?

如何选择每组的首页

目标是从DataFrame的每组中提取具有最高值的首页。在分析数据趋势或识别特定类别中的顶级参与者时,经常会遇到这种情况。为了实现这一点,可以使用几种方法:

窗口函数:

窗口函数提供了一种在组内执行计算的方法。在这种情况下,我们可以使用row_number()函数根据指定的排序为每一行分配一个序列号。然后可以通过过滤排名为1来识别首页。

<code class="language-scala">import org.apache.spark.sql.functions.{row_number, max, broadcast}
import org.apache.spark.sql.expressions.Window

val df = sc.parallelize(Seq(
  (0,"cat26",30.9), (0,"cat13",22.1), (0,"cat95",19.6), (0,"cat105",1.3),
  (1,"cat67",28.5), (1,"cat4",26.8), (1,"cat13",12.6), (1,"cat23",5.3),
  (2,"cat56",39.6), (2,"cat40",29.7), (2,"cat187",27.9), (2,"cat68",9.8),
  (3,"cat8",35.6))).toDF("Hour", "Category", "TotalValue")

val w = Window.partitionBy($"hour").orderBy($"TotalValue".desc)

val dfTop = df.withColumn("rn", row_number.over(w)).where($"rn" === 1).drop("rn")

dfTop.show
// +----+--------+----------+
// |Hour|Category|TotalValue|
// +----+--------+----------+
// |   0|   cat26|      30.9|
// |   1|   cat67|      28.5|
// |   2|   cat56|      39.6|
// |   3|    cat8|      35.6|
// +----+--------+----------+</code>
登录后复制

简单的SQL聚合后连接:

或者,我们可以使用SQL执行聚合,然后将结果与原始DataFrame连接以提取每组的首页。

<code class="language-scala">val dfMax = df.groupBy($"hour".as("max_hour")).agg(max($"TotalValue").as("max_value"))

val dfTopByJoin = df.join(broadcast(dfMax),
    ($"hour" === $"max_hour") && ($"TotalValue" === $"max_value"))
  .drop("max_hour")
  .drop("max_value")

dfTopByJoin.show

// +----+--------+----------+
// |Hour|Category|TotalValue|
// +----+--------+----------+
// |   0|   cat26|      30.9|
// |   1|   cat67|      28.5|
// |   2|   cat56|      39.6|
// |   3|    cat8|      35.6|
// +----+--------+----------+</code>
登录后复制

使用结构体排序:

无需使用窗口函数或连接即可获得相同结果的一种简洁方法是根据包含值和类别的结构体对数据进行排序。然后,此结构体的最大值将返回每组所需的首页。

<code class="language-scala">val dfTop = df.select($"Hour", struct($"TotalValue", $"Category").alias("vs"))
  .groupBy($"hour")
  .agg(max("vs").alias("vs"))
  .select($"Hour", $"vs.Category", $"vs.TotalValue")

dfTop.show
// +----+--------+----------+
// |Hour|Category|TotalValue|
// +----+--------+----------+
// |   0|   cat26|      30.9|
// |   1|   cat67|      28.5|
// |   2|   cat56|      39.6|
// |   3|    cat8|      35.6|
// +----+--------+----------+</code>
登录后复制

以上是如何高效地选择 Spark DataFrame 中每组中具有最高值的第一行?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板