案例要求
假设某个目录下有多个文本文件,每个文件中的每一行内容均为一个整数。要求读取所有文件中的整数,进行排序后,输出到一个新文件中,输出的内容为每行两个整数,第一个整数为第二个整数的排序位次,第二个整数为原待排序的整数。
代码
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import org.apache.spark.HashPartitioner
object FileSort {
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("FileSort")
val sc = new SparkContext(conf)
val dataFile = "file:///home/hadoop/data"
val lines = sc.textFile(dataFile, 3)
val index = 0
val result = lines.filter(_.trim().length>0).map(n=>(n.trim.toInt, "")).partitionBy(new HashPartitioner(1)).sortByKey().map(t => {
index += 1
(index, t._1)
})
result.saveAsTextFile("file:///home/hadoop/result")
sc.stop()
}
}
代码解释
在读入文件时设置分区数,分区的作用:
可以增加并行度,lines的3个分区分布在不同的工作节点WorkerNode1、WorkerNode2、WorkerNode3上,这3个工作节点可以分别启动1个线程来对这3个分区的数据进行并行处理,增加任务的并行度,提高执行效率。
在排序时使用new HashPartitioner(1)
将各分区处理结果合并到一个分区中,再继续后续的键排序。
参考:林子雨 《spark编程基础》