Spark | 分组排序

本文探讨了在Spark中处理分组排序的问题,推荐使用DataFrame和aggregateByKey()方法。相较于groupByKey(),aggregateByKey()通过map-side预聚合减少shuffle操作,提高效率。文章详细解释了aggregateByKey()的参数含义及其作用,指出它如何通过初始化值、映射函数和规约操作实现高效的数据聚合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录下Spark分组排序时遇到的问题,需求问题如下:

当前有HDFS文件数据内容为:

(字段顺序为手机号-phone、用户ID-userId、线路-line、时间戳-clientTimestamp),然后读取HDFS文件内容生成rdd,其中rdd的格式为( (phone,userId,line))

130xxxxxxxx&1980098385910287364&1004&1568528894
130xxxxxxxx&2233727976012209153&1005&1568555149
130xxxxxxxx&2320761066814396420&1002&1568515662
130xxxxxxxx&1956824763490556928&1005&1568538553
130xxxxxxxx&2255034634315076610&1001&1568528871

 

1、使用Spark DataFrame完成分组排序(推荐)

val userLineDF = rdd.map( x=>{((x._2,x._3),1)}).reduceByKey(_+_).map(x=>(x._1._1,x._1._2,x._2)).toDF("userId","line","rideCount")

val dfTop1 = userLineDF.withColumn("rank",row_number().over(Window.partitionBy("userId").orderBy(desc("rideCount")))).where("rank=1").select("userId","line").rdd.map(x=>{
  val v = x.getString(1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值