之前用到的是MapReduce 解决二次排序问题,另一种实现方式是利用Spark实现,就简单多了
我们考虑如下数据:
y,2,5
x,1,3
y,1,7
y,1,1
y,3,1
x,3,6
z,1,4
z,2,8
z,3,7
z,4,0
p,2,6
p,4,7
p,1,9
p,6,0
p,7,3
我们希望最终结果是这样 :
首先按字母排序,然后按第一个数字,最后按第三个数字排序
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
/**
* 实验数据如下:
* y,2,5
* x,1,3
* y,1,7
* y,1,1
* y,3,1
* x,3,6
* z,1,4
* z,2,8
* z,3,7
* z,4,0
* p,2,6
* p,4,7
* p,1,9
* p,6,0
* p,7,3
*/
class Text {
def main(args: Array[String]): Unit = {
// if (args.length < 1) {
// System.out.print("Usage : SecondarySort <file>")
// System.exit(-1)
// }
// var inputpath = args(0)
// System.out.print("args(0) : <file> = " + inputpath)
var inputpath = "C:/Users/2456910384/Desktop/a.txt" //輸入文件
val conf = new SparkConf().setMaster("local").setAppName("My App")
val sc = new SparkContext(conf)
val pair = sc.textFile(inputpath, 10) //初始键值对
println(pair.collect().mkString(","))
val map = pair.map(x => (x.split(",")(0),(x.split(",")(1), x.split(",")(2)))) //转化为(x,(1,3))形势
val temresult = map.groupByKey() //按键排序
val result = temresult.mapValues(f => { //对键的值排序
f.toList.sortWith((x,y) => {
if (x._1==y._1) {
x._2<y._2
}else {
x._1 < y._1
}
})
})
println(result.collect().mkString("\n"))
result.saveAsTextFile("")
}
}
输出结果如下:
(x,List((1,3), (2,9), (3,6)))
(y,List((1,1), (1,7), (2,5), (3,1)))
(z,List((1,4), (2,8), (3,7), (4,0)))
(p,List((1,9), (2,6), (4,7), (6,0), (7,3)))