Spark 实验:Scala手机号流量求和排序

news/2024/11/24 2:23:02/

一、实验描述

根据数据文件phone_data.txt按照如下需求:
1)统计每一个手机号耗费的总上行流量、下行流量、总流量
2)将统计结果按照手机归属地不同号段(手机号前3位)输出到不同文件中
3)根据需求1)产生的结果再次对总流量进行排序。
4)按照要求2)每个手机号段输出的文件中按照总流量内部排序。
数据:
参看 phone_data.txt 文件
输入数据格式:
在这里插入图片描述

输出数据格式:
在这里插入图片描述

二、实验分析

(1) 由于需要统计每一个手机号耗费的总上行流量、下行流量、总流量,故可以将手机号当作键、其上行流量与上行流量以及总流量构成的Array作为值保存在Map中。通过读取文件并遍历每一行,为Map添加键值或更新键的值。然后遍历Map将统计结果写入文件。
(2) 在(1)的基础上需要按照手机归属地不同号段(手机号前3位)输出到不同文件中,这一需求可以通过读取(1)的统计结果文件并遍历行,将每行的前三个字符作为键、行字符串构成的Array作为值保存在Map中,在遍历过程中添加键值或更新值(Array新增一个行字符串)。然后遍历Map,以键为文件名,并遍历值作为文件的内容。
(3) 在(1)的基础上需要按总流量排序,这一需求可以通过读取(1)的统计结果文件并遍历行,将行字符串作为Tuple的第一个元素、总流量作为Tuple的第二个元素保存在Array中,然后通过Array的sortBy方法排序并遍历排序结果同时写入文件中。
(4) 在(1)的基础上需要按照要求(2)每个手机号段输出的文件中按照总流量内部排序,这个需求其实是(2)、(3)的结合。这一需求可以通过读取(1)的统计结果文件并遍历行,将每行的前三个字符作为键、行字符串构成的Array作为值保存在Map中,在遍历过程中添加键值或更新值(Array新增一个行字符串)。然后遍历Map,以键为文件名构建PrintWriter对象,同时遍历值,把值的各个元素作为Tuple的第一个元素、并从各个元素分割总流量作为Tuple的第二个元素保存在Array中,通过Array的sortBy方法排序并遍历排序结果,同时通过构建的PrintWriter对象写入文件中。

三、实验代码

(1) PhoneFlowSum.scala

package cn.edu.neu.Question_1import java.io.{File, PrintWriter}import scala.io.Sourceobject PhoneFlowSum {def main(args: Array[String]): Unit ={val file = Source.fromFile("src/main/resources/phone_data.txt")val lines = file.getLines()val phoneFlowMap = scala.collection.mutable.Map[String, Array[Int]]()lines.foreach(line => {val strs = line.split(" {4}")if(phoneFlowMap.contains(strs(1))){val newFlow = Array(strs(8).toInt, strs(9).toInt, strs(8).toInt+strs(9).toInt)var i = 0for (elem <- newFlow) {phoneFlowMap(strs(1))(i) += elemi += 1}}else{phoneFlowMap+=(strs(1) -> Array(strs(8).toInt, strs(9).toInt, strs(8).toInt+strs(9).toInt))}})val out = new PrintWriter("src/main/resources/question_1.txt")for ((k, v) <- phoneFlowMap) {out.print(k+"\t")v.foreach(flow => out.print(flow+"\t"))out.println()out.flush()}out.close()}
}

在这里插入图片描述

(2) PhoneFlowSumPartition.scala

package cn.edu.neu.Question_2import java.io.PrintWriterimport scala.io.Sourceobject PhoneFlowSumPartition {def main(args: Array[String]): Unit ={val file = Source.fromFile("src/main/resources/question_1.txt")val lines = file.getLines()val partitions = scala.collection.mutable.Map[String, Array[String]]()lines.foreach(line => {if(partitions.contains(line.substring(0,3))){partitions.update(line.substring(0,3),partitions(line.substring(0,3)):+line)}else{partitions+=(line.substring(0,3) -> Array(line))}})for ((k, v) <- partitions) {val out = new PrintWriter("src/main/resources/question_2/"+k+".txt")v.foreach(phoneFlow => out.println(phoneFlow))out.flush()out.close()}}
}

在这里插入图片描述

(3) PhoneFlowSort.scala

package cn.edu.neu.Question_3import java.io.PrintWriterimport scala.io.Sourceobject PhoneFlowSumSort {def main(args: Array[String]): Unit ={val file = Source.fromFile("src/main/resources/question_1.txt")val lines = file.getLines()val flowArrs = new Array[(String, Int)](20)var i = 0for (elem <- lines) {println(elem)val strs = elem.split("\t")flowArrs(i)=(elem, strs(3).toInt)i += 1}val sortFlow = flowArrs.sortBy(flow => flow._2)// println(sortFlow.getClass)val out = new PrintWriter("src/main/resources/question_3.txt");sortFlow.foreach(elem => {out.println(elem._1);out.flush()})out.close()}
}

在这里插入图片描述

(4) PhoneFlowSumPartitionSort.scala

package cn.edu.neu.Question_4import java.io.PrintWriterimport scala.io.Sourceobject PhoneFlowSumPartitionSort {def main(args: Array[String]): Unit ={val file = Source.fromFile("src/main/resources/question_1.txt")val lines = file.getLines()val partitions = scala.collection.mutable.Map[String, Array[String]]()lines.foreach(line => {if(partitions.contains(line.substring(0,3))){partitions.update(line.substring(0,3),partitions(line.substring(0,3)):+line)}else{partitions+=(line.substring(0,3) -> Array(line))}})for ((k, v) <- partitions) {val flowArrs = new Array[(String, Int)](v.length)val out = new PrintWriter("src/main/resources/question_4/"+k+".txt")var i = 0for (elem <- v) {val strs = elem.split("\t")flowArrs(i) = (elem, strs(3).toInt)i += 1}val sortFlow = flowArrs.sortBy(flow => flow._2)(Ordering.Int.reverse)for (elem <- sortFlow) {out.println(elem._1);out.flush()}out.close()}}
}

在这里插入图片描述


http://www.ppmy.cn/news/942489.html

相关文章

android统计流量,Android 获取手机整体流量使用情况以及某个应用的流量的统计

很多安全卫士类软件都实现了网速监测功能,也算是一个比较实用的功能。Android下,TrafficStats类实现了对流量的统计。 /proc/uid_stat/uid/tcp_send 上传流量 /proc/uid_stat/uid/tcp_rcv 下载流量 static long getMobileRxBytes()//获取通过Mobile连接收到的…

通过 adb 命令获取手机应用 流量

step one&#xff1a;./adb shell pm list packages //找到对应应用安装包 step two: ./adb shell dumpsys package {packgeName} |findstr userId //找到目标应用的uid ./adb shell ps |findstr "{packagename}" //找到目标应用的uid 建议用这个 step three …

3行命令搞定应用流量查询

一、查看原理&#xff1a; 某个应用的网络流量数据保存在系的/proc/uid_stat/$UID/tcp_rcv文件中。 二、步骤&#xff1a; 查看当前应用的pid&#xff1a;通过ps命令查看当前应用的进程id&#xff0c;比如应用中心的获取方式为 ps | grep appstore&#xff0c;获取的值为10…

浙江上海全国各地手机流量查询工具

浙江上海全国各地手机流量查询工具

android真机流量测试,手机终端app流量测试

一、Android终端app流量测试 流量测试的原理:在安卓手机上,应用的网络流量数据都会保存在系统的/proc/uid_stat/$UID/tcp_rcv 和/proc/uid_stat/$UID/tcp_snd两个文件夹里面,一个是请求耗费的流量,一个是接受的数据流量,这两个数据是由系统记录的,在我们启动某个软件的时…

手机打开流量显示无服务器,手机无限流量服务器

手机无限流量服务器 内容精选 换一换 接口名称GetCloudPhoneServerDetailGetCloudPhoneServerDetail功能描述根据server_id查询云手机服务器的详细信息。根据server_id查询云手机服务器的详细信息。GET /v1/{project_id}/cloud-phone/servers/{server_id}参数说明请参见表1。 使…

手机修改服务器流量,云服务器变手机流量

云服务器变手机流量 内容精选 换一换 使用弹性云服务器携带其挂载的数据盘一起创建整机镜像,创建的整机镜像包含操作系统、应用软件,以及用户的业务数据,可用于快速发放相同配置的弹性云服务器,实现数据搬迁。创建整机镜像的流程:先为云服务器创建云服务器备份,再通过云服…

CSS 渐变边框及动画

转载请注明出处&#xff0c;点击此处 查看更多精彩内容 用 CSS 实现渐变边框及动画&#xff0c;下面对关键点进行解释说明&#xff0c;查看完整代码及预览效果请 点击这里。 简单说明原理&#xff1a;使用伪元素 ::before 绘制一个渐变色&#xff0c;然后使用伪元素 ::after 绘…