You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark按X列分组聚合:获取Z最小值对应的关联Y值

嘿,这个需求在Spark里其实有挺简洁的实现方式,我给你分享两种常用的Spark风格方案:

方案一:用窗口函数(Window)精准控制选择逻辑

这种方法适合你需要更灵活筛选规则的场景(比如Z值相同时想指定选哪一行),思路是给每个分组内的行按Z排序,然后取每组的第一行:

import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions._

// 定义窗口:按X分组,先按Z升序排,Z相同的话用行号随机选一个
val windowSpec = Window.partitionBy("X").orderBy(col("Z").asc, row_number().asc)

// 给每行加行号,过滤出每组第一行,再保留需要的列
val result = df.withColumn("row_num", row_number().over(windowSpec))
  .filter(col("row_num") === 1)
  .select("X", "Y", "Z")

方案二:用Struct组合列实现极简聚合

如果只是要Z最小值对应的Y(多个匹配行任选其一),这个方法更简洁,利用Spark对Struct类型的比较逻辑(先比第一个字段,再比第二个):

import org.apache.spark.sql.functions._

// 把Z和Y打包成Struct,聚合取最小的Struct,再拆解开字段
val result = df.groupBy("X")
  .agg(min(struct(col("Z"), col("Y"))).alias("min_struct"))
  .select(
    col("X"),
    col("min_struct.Y").alias("Y"),
    col("min_struct.Z").alias("Z")
  )

两种方法都能得到你想要的输出:

XYZ
A15
B515

如果Z有多个最小值,方案一通过row_number()会随机选一个(或者你可以改成按Y排序选特定的),方案二则会选Z最小且Y最小的那行,都符合你“任选其一”的要求~

内容的提问来源于stack exchange,提问作者RefiPeretz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:31:35