scala之Spark 数据帧的自定义聚合

powertoolsteam 阅读:203 2025-06-02 22:19:02 评论:0

我想知道是否有某种方法可以为 Spark 数据帧指定自定义聚合函数。如果我有一个包含 2 列 idvalue 的表,我想 groupBy id 并将值聚合到每个 的列表中值 像这样:

来自:

john | tomato 
john | carrot 
bill | apple 
john | banana 
bill | taco 

到:

john | tomato, carrot, banana 
bill | apple, taco 

这在数据框中可能吗?我问的是数据帧,因为我正在将数据作为 orc 文件读取,并且它是作为数据帧加载的。我认为将其转换为 RDD 是低效的。

请您参考如下方法:

我只想简单地使用以下内容:

import org.apache.spark.sql.functions.collect_list 
val df = Seq(("john", "tomato"), ("john", "carrot"),  
             ("bill", "apple"), ("john", "banana"),  
             ("bill", "taco")).toDF("id", "value") 
// df: org.apache.spark.sql.DataFrame = [id: string, value: string] 
 
val aggDf = df.groupBy($"id").agg(collect_list($"value").as("values")) 
// aggDf: org.apache.spark.sql.DataFrame = [id: string, values: array<string>] 
 
aggDf.show(false) 
// +----+------------------------+ 
// |id  |values                  | 
// +----+------------------------+ 
// |john|[tomato, carrot, banana]| 
// |bill|[apple, taco]           | 
// +----+------------------------+ 

您甚至不需要调用底层的 rdd


标签:Spark
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号