Spark分组后创建结构体数组的实现方法求助
Spark实现Books列生成方案
你需要通过分组+收集结构化列表的方式生成Books列,以下是具体实现代码(包含Python和Scala两种常用版本):
核心思路
按St Id分组后,使用collect_list函数将每组内的St Id、Book Id、Pages三个字段打包成结构化数据并收集为列表,即可得到目标格式的Books列;Num Books可直接通过分组计数获取(若你已实现计数,可只保留Books列的生成逻辑)。
Python 版本
from pyspark.sql import functions as F # 假设你的原始数据集已经加载为DataFrame df result_df = df.groupBy("St Id") \ .agg( # 将三个字段打包成结构体,再收集为列表 F.collect_list(F.struct("St Id", "Book Id", "Pages")).alias("Books"), # 统计借阅数量(若已实现可删除此行) F.count("*").alias("Num Books") ) # 查看结果 result_df.show(truncate=False)
Scala 版本
import org.apache.spark.sql.functions.{collect_list, struct, count} // 假设原始数据集已加载为DataFrame df val resultDf = df.groupBy("St Id") .agg( collect_list(struct("St Id", "Book Id", "Pages")).alias("Books"), count("*").alias("Num Books") ) // 查看结果 resultDf.show(false)
输出说明
执行后得到的结果会和你需求的格式完全匹配:
Books列会以[St Id, Book Id, Pages]的结构化数组形式展示每组的借阅记录Num Books列对应每组的借阅次数
内容的提问来源于stack exchange,提问作者anoop
相关产品推荐
相关产品推荐

