Scala初级实践——统计手机耗费流量(1)

【实验描述】

本实验主要使用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

【实验内容】

该统计手机流量模块主要有以下四个需求:统计手机的上行流量、下行流量、总流量功能,将统计结果根据手机归属地不同存储在不同文件当中功能等两个功能。本模块的功能点结构图如下图所示:

本次实验项目的目录结构如下图所示:

【实验步骤】

本实验的主要步骤如下:

  1. 环境准备
  2. 使用Scala实现统计每一个手机号耗费的总上行流量、下行流量、总流量功能
  3. 使用Scala实现将统计结果按照手机归属地不同号段(手机号前3位)输出到不同文件中
  4. 使用Scala实现在需求1)的基础上再次对总流量进行排序的功能
  5. 使用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 = 0def setSum: Unit = {this.sumFlow = upFlow + downFlow}override def toString: String = {return upFlow + "    " + downFlow + "    " + sumFlow}
}
2)编写读取文件代码:
    val dirfile=new File("data")val files=dirfile.listFilesfor(file <- files) println(file)val listFiles=files.toList
3)编写处理逻辑部分代码:
    val flowMap = scala.collection.mutable.SortedMap[String,FlowBean]()for(file <- listFiles){val list = Source.fromFile(file).getLines().toListfor(i <- list){val strings:Array[String] = i.split("    ")val phone_number= strings(1)var flowBean = new FlowBeanflowBean.setUpFlow(strings(strings.size - 3).toLong)flowBean.setDownFlow(strings(strings.size - 2).toLong)flowBean.setSumif(flowMap.contains(phone_number)){flowMap(phone_number).downFlow += flowBean.getDownFlowflowMap(phone_number).upFlow += flowBean.getUpFlowflowMap(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;可以借鉴,请勿抄袭)

Scala初级实践——统计手机耗费流量(1)相关推荐

  1. Scala编程初级实践-统计学生成绩

    Scala编程初级实践 统计学生成绩 学生的成绩清单格式如下所示,第一行为表头,各字段意思分别为学号.性别.课程名1.课程名2等,后面每一行代表一个学生的信息,各字段之间用空白符隔开 Id gende ...

  2. Hadoop MapReduce实例:按照手机号归属地分区统计手机上网流量(Reduce Task进程数设置)

     

  3. 15.大数据---Mapreduce案例之---统计手机号耗费的总上行流量、下行流量、总流量

    Mapreduce案例之-统计手机号耗费的总上行流量.下行流量.总流量 1.需求: 统计每一个手机号耗费的总上行流量.下行流量.总流量 2.数据准备: 2.1 输入数据格式: 时间戳.电话号码.基站的 ...

  4. 手机上网流量统计_全国人均每月手机上网流量竟然有这么多!网友:拖后腿了...

    教授先来问各位机友一个问题:大家平时看电影看综艺,手机用得多吗?每个月手机都会花费多少流量呢? 如果你对这个问题不是很了解,或许可以来看看这份数据. 上个月,我国工信部公布了今年 8 月通信业经济运行 ...

  5. spark企业经典案例之手机app流量统计

    spark企业经典案例之手机app流量统计,本课程是基于企业真实项目案例中的一个模块为背景讲解,此业务涉及spark统计,然后通过phpweb进行读取数据,最终通过手机端展示,根据公司案例抽取出来的模 ...

  6. 手机上网流量统计_手机流量上网课花掉800元话费?“助学流量包”来了!湖南送流量达2880万G...

    图片来源:视觉中国 " 请问是彭仁哥家吗?"3 月 9 日,怀化分公司城东分局杨村支局局长向纲跃和网格经理梁平云,来到河西街道方石坪村彭仁哥家中,进行宽带网络安装. 近日,记者从省 ...

  7. Spark综合大作业:RDD编程初级实践

    Spark综合大作业:RDD编程初级实践 实验配置:操作系统:Ubuntu16.04 | 环境:Spark版本:2.4.0 | 软件:Python版本:3.4.3. 文章目录 一.实验目的 二.实验平 ...

  8. 流量节省模式 Android,这三种方法让你节省更多手机上网流量

    大多数手机用户应该都知道最基本的流量管理方式--没有Wi-Fi可用时就不看视频.不玩在线游戏.或者下载大型应用--除非你拥有不限流量套餐.但如果你在使用流量时已经很节约,但每个月的用量依然会超出流量套 ...

  9. 巧妙地帮你的手机节省流量,担心流量超出的机友们看过(转)

    一.关闭自动同步和更新 1.关闭自动同步.安卓系统自动同步可能是流量偷跑的其中一个原因,安卓手机系统默认在联网的情况下,会自动访问谷歌的服务器,查询系统更新情况,而在大多数情况下,手机用户并不需要通过 ...

最新文章

  1. ValueError: y_true and y_pred contain different number of classes 9, 2. Please provide the true labe
  2. EJB3.0 定时服务:Timer Service
  3. 黑苹果睡眠无法唤醒_电脑睡眠后无法唤醒怎么办?
  4. tftp服务器_Transfer for Mac(TFTP服务器)
  5. pagefile.sys
  6. Java路径问题最终解决方案
  7. 使用tf.keras搭建mnist手写数字识别网络
  8. FLV视频在IIS6.0下不能播放 处理的方法
  9. 数据分析团队的价值_您的数据科学团队的价值
  10. java中数组的返回值是什么类型_Java数组也是一种数据类型
  11. 【计算机网络复习】1.2.2 OSI参考模型
  12. maven 插件深入了解
  13. java字符串替换的问题
  14. MySQL数据库(3)_MySQL数据库表记录操作语句
  15. 转:Python正则表达式操作指南
  16. 基于正点原子STM32F407开发板源码和贪吃蛇程序
  17. 电子科技大学《图论及其应用》复习总结--第四章 欧拉图与哈密尔顿图
  18. 【论文】(COPRA)Finding overlapping communities in networks by label propagation
  19. Diamond安装步骤
  20. 产品经理,该如何做好「自己」这款产品?

热门文章

  1. OKR教练:OKRs-E如何帮你落地OKR
  2. Crossplane - 比 Terraform 更先进的云基础架构管理平台?
  3. cocos creator经典游戏英文版《俄罗斯方块》源码H5+安卓+IOS三端源码
  4. gps定位器更换平台指令-GPS定位器接入平台指令
  5. CTF-WEB总结(四-题目来源i春秋)
  6. laravel 教程
  7. dnf剑魂buff等级上限_DNF剑魂职业定位、装备、加点、猴戏、新老换装详解
  8. 代码 羊角螺旋_机电设计中的数学之美——羊角螺旋让你平稳过弯
  9. pdf转word ocr_OCR免费识别撞上PDF免费转WORD,这下尴尬了!
  10. 厉害了,可以不重启JVM就替换掉已经加载的类?