Apache Spark 3.3.2:分组聚合时如何自动包含所有字段?
解决方案
你可以通过将所有列打包成一个结构体(struct),再对该结构体使用collect_set来实现无需逐个指定列的需求,具体代码如下:
import org.apache.spark.sql.functions.{collect_set, struct} val df: Dataset[Row] = ??? // 获取所有列并打包成struct val allColsStruct = struct(df.columns.map(col): _*) df .groupBy($"someKey") .agg(collect_set(allColsStruct).alias("all_columns_set"))
说明
df.columns.map(col)会自动把DataFrame的所有列名转换成列表达式,不用手动逐一列举。struct(...)将所有列打包为一个结构体字段,collect_set会收集每组的完整结构体实例,自然包含所有列(包括分组键someKey)。- 如果后续需要展开结果里的结构体,可以用
select($"someKey", explode($"all_columns_set").alias("cols")),再结合cols.*取出各列。
内容的提问来源于stack exchange,提问作者Ashwin
相关产品推荐
相关产品推荐

