我有以下RDD数据集:
ABC [G4, G3, G1] 3
FFF [G5, G4, G3] 3
CDE [G5,G4,G3,G2] 4
XYZ [G4, G3] 2
首先需要按最后一列desc排序,如果最后一列是相同的,则按第一个元组的desc顺序排序。预期的结果是
CDE [G5,G4,G3,G2] 4
FFF [G5, G4, G3] 3
ABC [G4, G3, G1] 3
XYZ [G4, G3] 2
提前感谢。
答案 0 :(得分:2)
您可以使用sortBy
:
rdd.sortBy(r => (r._3, r._2(0)), false)
在上面,r._3
代表最后一列,r._2(0)
代表第二列的第一个元素(这是一个数组),false
指定顺序应该是降。请记住,由于改组,排序是一项昂贵的操作。
<强>更新强>
如果我们假设您从pair rdd
开始,那么这是一个可重复的示例:
/// Generate data
val rdd = sc.parallelize(Seq(("ABC","G4"),("ABC","G3"),
("ABC","G1"),("FFF","G5"),
("FFF","G4"),("FFF","G3"),
("CDE","G5"),("CDE","G4"),
("CDE","G3"),("CDE","G2"),
("XYZ","G4"),("XYZ","G3")))
/// Put values in a list and calculate its size
val rdd_new = rdd.groupByKey.mapValues(_.toList).map(x => (x._1, x._2, x._2.size))
/// Now this works
rdd_new.sortBy(r => (r._3, r._2(0)), false).collect()
/// Array[(String, List[String], Int)] = Array((CDE,List(G5, G4, G3, G2),4), (FFF,List(G5, G4, G3),3), (ABC,List(G4, G3, G1),3), (XYZ,List(G4, G3),2))
答案 1 :(得分:0)
我不确定上述答案为什么不起作用。它看起来很好。试试这段代码。
以下是我的意见:
i1,array1,10
i5,array2,50
i4,array3,20
i2,array4,20
代码:
val idRDD = sc.textFile(inputPath)
val idSOrted = idRDD.map { rec => ((rec.split(",")(2),rec.split(",")(0)),(rec.split(",")(1))) }.sortByKey(false).map(rec=>(rec._1._1,rec._2,rec._1._2))
这是o / p:
(50,array2,i5)
(20,array3,i4)
(20,array4,i2)
(10,array1,i1)