1. 程式人生 > >[spark程序]統計人口平均年齡(本地文件)(詳細過程)

[spark程序]統計人口平均年齡(本地文件)(詳細過程)

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程序]統計人口平均年齡(本地文件)(詳細過程)