本实验主要使用Scala语言来实现对手机流量的计算。在该实验中,共有四个需求:
1)统计每一个手机号耗费的总上行流量、下行流量、总流量
2)将统计结果按照手机归属地不同号段(手机号前3位)输出到不同文件中
3)根据需求1)产生的结果再次对总流量进行排序。
4)按照要求2)每个手机号段输出的文件中按照总流量内部排序。
【实验目的】掌握Scala编程环境的配置安装,能够掌握Scala基本语法,掌握面向对象的编程思想,能够掌握函数式编程思想,能够运用Scala语言进行程序代码编写,能够应用Scala解决实际问题,能够进行应用案例设计和编程实现。
【实验环境】*** 作系统:Windows 10;
开发工具:IntelliJ IDEA 2020.2.1 x64
JDK环境:JDK 1.8.0_301。
Scala: scala-2.12.11
【实验内容】该统计手机流量模块主要有以下四个需求:统计手机的上行流量、下行流量、总流量功能,将统计结果根据手机归属地不同存储在不同文件当中功能等两个功能。本模块的功能点结构图如下图所示:
本次实验项目的目录结构如下图所示:
【实验步骤】本实验的主要步骤如下:
- 环境准备
- 使用Scala实现统计每一个手机号耗费的总上行流量、下行流量、总流量功能
- 使用Scala实现将统计结果按照手机归属地不同号段(手机号前3位)输出到不同文件中
- 使用Scala实现在需求1)的基础上再次对总流量进行排序的功能
- 使用Scala实现在要求2)的基础上每个手机号段输出的文件中按照总流量内部排序的功能
具体步骤如下所述:
1. 环境准备 (1) 创建maven工程: (2) 在pom.xml文件中添加相关依赖: (3) 添加可以将scala代表编译成class文件的插件 (4) 在项目中添加scala扩展 (5) 增加项目的框架支持 2.使用Scala实现统计每一个手机号耗费的总上行流量、下行流量、总流量功能 (1)查看输入的数据格式发现输入的数据中,每行字符串之间以“ ”为间隔隔开,且我们要取的字符为以“ ”切割后的第二个字符和倒数第二,第三个字符。
(2)查看期望输出的数据格式 (3)需求分析本次任务的需求为统计每一个手机号耗费的上行流量、下行流量、总流量。首先,我们需要知道输入的数据中每一行数据我们需要截取的是哪一部分的数据,通过观察,我们发现,我们需要的是第一个手机号码以及倒数第二个,第三个字符。倒数第一个字符为网络状态码。
在使用Scala语言编写时,我们首先需要从文件中将数据读出,并将读出的文件转换成列表的形式,之后对于每一个文件,我们每次获取这个文件资源的一行数据,将改行数据按照“ ”来进行切割,之后分别得到电话号码,上行流量,下行流量以及总流量。之后我们将电话号码作为key,上行流量、下行流量以及总流量封装在一起(此处可以使用对象,也可以使用元组)作为value,放入提前定义好的SortedMap当中。之后每读取一行数据就进行一次判断,如果该SortedMap中存在该key,则将其上行流量,下行流行分别相加,之后再计算一下总流量;如果不存在,则向该map中添加这对KV对。最后在对该SortedMap进行遍历,输出相关数据。
(4)编写Scala程序 1)编写Class FlowBean,其中的属性包括上行流量,下行流量以及总流量三个属性:class FlowBean{ @BeanProperty var upFlow : Long = 0 @BeanProperty var downFlow : Long = 0 @BeanProperty var sumFlow : Long = 0 def setSum: Unit = { this.sumFlow = upFlow + downFlow } override def toString: String = { return upFlow + " " + downFlow + " " + sumFlow } }2)编写读取文件代码:
val dirfile=new File("data") val files=dirfile.listFiles for(file <- files) println(file) val listFiles=files.toList3)编写处理逻辑部分代码:
val flowMap = scala.collection.mutable.SortedMap[String,FlowBean]() for(file <- listFiles){ val list = Source.fromFile(file).getLines().toList for(i <- list){ val strings:Array[String] = i.split(" ") val phone_number= strings(1) var flowBean = new FlowBean flowBean.setUpFlow(strings(strings.size - 3).toLong) flowBean.setDownFlow(strings(strings.size - 2).toLong) flowBean.setSum if(flowMap.contains(phone_number)){ flowMap(phone_number).downFlow += flowBean.getDownFlow flowMap(phone_number).upFlow += flowBean.getUpFlow flowMap(phone_number).sumFlow += flowBean.getSumFlow }else{ flowMap+=(phone_number->flowBean) } } }4)编写输出到文件的代码以及关闭输出流:
//输出流 val out = new FileWriter("output//experiment1//output.txt",true) //无序的 flowMap.foreach( obj => out.write(obj._1 + " " + obj._2 + "n") ) out.close()5)功能测试,再本地运行该程序,查看是否可以将输入文件中的数据处理成需求中要求的输出格式,查看运行结束后output.txt文件:
经过相关检验计算,通过该scala编写的程序可以满足第一个需求。
未完待续。。。。
实验来源(东北大学软件学院大数据班 2021/11/25;可以借鉴,请勿抄袭)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)