Spark中groupByKey后对Iterable内的TAG键排序求助
嘿,我来帮你搞定这个分组内按TAG排序的需求!直接上修改后的代码,然后给你拆解每一步的作用:
实现分组内按TAG排序的代码
val skuRDD2: RDD[(String, Iterable[(String, ImageInfo2)])] = DF.select("ID", "TAG","MEDIA_ID","IMAGE_NAME","PATH").rdd .map(r => (r.getString(0), (r.getString(1), ImageInfo2(r.getString(2), r.getString(3), r.getString(4))))) .groupByKey() // 核心:对每个分组里的元素按TAG(元组第一个元素)排序 .mapValues(iter => iter.toList.sortBy(_._1).toIterable)
关键步骤解释:
mapValues:这个方法专门用来处理RDD的value部分,不会改动key(也就是你的skuid),非常适合这种分组后只处理组内数据的场景。iter.toList:因为原生的Iterable没有直接的排序API,所以先转成List——List在Scala里提供了丰富的排序方法。sortBy(_._1):这里的_._1指代每个元组的第一个元素,也就是你要排序的TAG字段。默认是升序排序,如果需要降序的话,分两种情况:- 如果TAG是数值类型:
sortBy(-_._1) - 如果TAG是字符串类型:
sortBy(_._1)(Ordering[String].reverse)
- 如果TAG是数值类型:
.toIterable:最后把排序后的List转回Iterable,保证和你原来定义的skuRDD2类型一致,避免类型错误。
自定义排序的扩展
要是你需要更特殊的排序规则(比如按TAG的字符串长度排序),可以这么改:
.mapValues(iter => iter.toList.sortBy(_._1.length).toIterable)
内容的提问来源于stack exchange,提问作者Chandra
相关产品推荐
相关产品推荐

