[spark程序]統計人口平均年齡(本地文件)(詳細過程)
阿新 • • 發佈:2018-07-22
pro simple res 本地文件 object c package library 退回 port
一、題目描述
(1)編寫Spark應用程序,該程序可以在本地文件系統中生成一個數據文件peopleage.txt,數據文件包含若幹行(比如1000行,或者100萬行等等)記錄,每行記錄只包含兩列數據,第1列是序號,第2列是年齡。效果如下:
1 89 2 67 3 69 4 78
(2)編寫Spark應用程序,對本地文件系統中的數據文件peopleage.txt的數據進行處理,計算出所有人口的平均年齡。
二、實現
1、生成數據文件peopleage.txt
1)創建程序的目錄結構
創建一個存放代碼的目錄,進入目錄下創建一個目錄用來保存該題目所有文件(/swy/resource/spark/peopleage)
在peopleage目錄下建立src/main/scala代碼目錄,專門用來保存scala代碼文件,命令如下:
2)生成數據文件peopleage.txt的代碼
創建一個代碼文件GeneratePeopleAge.scala,用來生成數據文件peopleage.txt,命令如下:
代碼如下:
import java.io.FileWriter
import java.io.File
import scala.util.Random
object GeneratePeopleAge{
def main(args:Array[String]){
val fileWriter = new FileWriter(new File("/swy/resource/spark/peopleage/peopleage.txt"),false)
val rand = new Random()
for (i <- 1 to 1000){
fileWriter.write(i+" "+rand.nextInt(100))
fileWriter.write(System.getProperty("line.separator"))
}
fileWriter.flush()
fileWriter.close()
}
}
3)sbt打包
退回到people目錄下:
輸入如下:
name := "Simple Project"
version := "1.0"
scalaVersion := "2.11.12"
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.1.0"
輸入命令打包:
sbt package
打包成功:
4)運行文件,生成peopleage.txt
可以看到目錄下已經生成peopleage.txt,查看文件:
2、計算所有人口的平均年齡
1)創建CountAvgage.scala
2)代碼
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
object CountAvgAge {
def main(args:Array[String]) {
if (args.length < 1) {
println("Usage: CountAvgAge inputdatafile")
System.exit(1)
}
val conf = new SparkConf().setAppName("Count average age")
val sc = new SparkContext(conf)
val lines = sc.textFile(args(0),3)
val peopleNum =lines.count()
val totalAge = lines.map(line => line.split(" ")(1)).map(t => t.trim.toInt).collect().reduce((a,b) => a+b)
println("Total Age is: " +totalAge+ "; Number of People is: " +peopleNum)
val avgAge : Double = totalAge.toDouble / peopleNum.toDouble
println("Average Age is: " +avgAge)
}
}
3)打包
退回people文件夾,輸入命令打包:
4)運行程序
輸入如下命令:
結果:
參考:http://dblab.xmu.edu.cn/blog/1756-2/
[spark程序]統計人口平均年齡(本地文件)(詳細過程)