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") )
两种方法都能得到你想要的输出:
| X | Y | Z |
|---|---|---|
| A | 1 | 5 |
| B | 5 | 15 |
如果Z有多个最小值,方案一通过row_number()会随机选一个(或者你可以改成按Y排序选特定的),方案二则会选Z最小且Y最小的那行,都符合你“任选其一”的要求~
内容的提问来源于stack exchange,提问作者RefiPeretz
相关产品推荐
相关产品推荐

