加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 使用spark中的自定义函数聚合多个列

发布时间:2020-12-16 09:29:18 所属栏目:安全 来源:网络整理
导读:我想知道是否有一些方法可以为多列上的spark数据帧指定自定义聚合函数. 我有一个类似这样的表(名称,项目,价格): john | tomato | 1.99john | carrot | 0.45bill | apple | 0.99john | banana | 1.29bill | taco | 2.59 至: 我想将每个人的项目和成本汇总到
我想知道是否有一些方法可以为多列上的spark数据帧指定自定义聚合函数.

我有一个类似这样的表(名称,项目,价格):

john | tomato | 1.99
john | carrot | 0.45
bill | apple  | 0.99
john | banana | 1.29
bill | taco   | 2.59

至:

我想将每个人的项目和成本汇总到这样的列表中:

john | (tomato,1.99),(carrot,0.45),(banana,1.29)
bill | (apple,0.99),(taco,2.59)

这在数据帧中是否可行?我最近了解了collect_list,但似乎只适用于一列.

解决方法

作为DataFrame执行此操作的最简单方法是首先收集两个列表,然后使用UDF将两个列表压缩在一起.就像是:

import org.apache.spark.sql.functions.{collect_list,udf}
import sqlContext.implicits._

val zipper = udf[Seq[(String,Double)],Seq[String],Seq[Double]](_.zip(_))

val df = Seq(
  ("john","tomato",("john","carrot",("bill","apple","banana",1.29),"taco",2.59)
).toDF("name","food","price")

val df2 = df.groupBy("name").agg(
  collect_list(col("food")) as "food",collect_list(col("price")) as "price" 
).withColumn("food",zipper(col("food"),col("price"))).drop("price")

df2.show(false)
# +----+---------------------------------------------+
# |name|food                                         |
# +----+---------------------------------------------+
# |john|[[tomato,1.99],[carrot,0.45],[banana,1.29]]|
# |bill|[[apple,0.99],[taco,2.59]]                  |
# +----+---------------------------------------------+

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读