Spark中按key聚合数据集并将对应值汇总为列表的实现咨询
实现方案
你需要用到Spark SQL内置的collect_list聚合函数,按SchoolName和classId两个字段分组后,把同组的StudentId收集为列表即可,以下是两种常用实现方式:
方式1:DataFrame API实现
import org.apache.spark.sql.functions._ val resultDF = myDS .groupBy("SchoolName", "classId") .agg(collect_list("StudentId").alias("studentIdList")) // 输出查看结果 resultDF.show(false)
方式2:类型安全的Dataset API实现
import org.apache.spark.sql.functions._ case class AggResult(SchoolName: String, classId: Int, studentIdList: List[Long]) val resultDS = myDS .groupByKey(row => (row.SchoolName, row.classId)) .agg(collect_list[Long]("StudentId").as[List[Long]]) .map{ case ((school, clsId), idList) => AggResult(school, clsId, idList) } // 输出查看结果 resultDS.show(false)
补充说明
- 如果需要去重后的学生ID列表,可以把
collect_list替换为collect_set - 你示例里期望结果的学校名称和classId对应关系存在笔误,实际运行后会匹配输入数据集的真实分组:School1+1对应[100],School1+2对应[110,200],School2+3对应[300]
内容的提问来源于stack exchange,提问作者CoolGoose
相关产品推荐
相关产品推荐

