Spark RDD/Core 编程 API入门系列之简单移动互联网数据(五)
通过对移动互联网数据的分析,了解移动终端在互联网上的行为以及各个应用在互联网上的发展情况等信息。
具体包括对不同的应用使用情况的统计、移动互联网上的日常活跃用户(DAU)和月活跃用户(MAU)的统计,以及不同应用中的上行下行流量统计等分析。
为了简化移动互联网数据的分析,我这里是当个入门。
假设,移动互联网数据如下
NodeID即基站ID信息 CI即小区标识信息 IMEI即国际移动电话设备识别码 APP即应用名称 Time即访问时间 UplinkBytes即上行的字节数 DownlinkBytes即下行的字节数

1,1,460028714280218,360,2015-05-01,7,1116
1,2,460028714280219,qq,2015-05-02,8,121
1,3,460028714280220,yy,2015-05-03,9,122
1,4,460028714280221,360,2015-05-04,10,119
2,1,460028714280222,yy,2015-05-05,5,1119
2,2,460028714280223,360,2015-05-01,12,121
2,3,460028714280224,qq,2015-05-02,13,122
3,1,460028714280225,qq,2015-05-03,1,1117
3,2,460028714280226,qq,2015-05-04,9,1118
3,3,460028714280227,qq,2015-05-05,10,120
1,1,460028714280218,360,2015-06-01,11,1118
1,2,460028714280219,qq,2015-06-02,2,1119
1,3,460028714280220,yy,2015-06-03,9,1120
1,4,460028714280221,360,2015-06-04,10,119
2,1,460028714280222,yy,2015-06-05,11,1118
2,2,460028714280223,360,2015-06-01,11,121
2,3,460028714280224,qq,2015-06-02,4,1119
3,1,460028714280225,qq,2015-06-03,17,119
3,2,460028714280226,qq,2015-06-04,19,1119
3,3,460028714280227,qq,2015-06-05,20,121
新建mobileInternet


数据源,放在本项目根目录下的data目录下








代码:
package cn.spark.study.core
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.log4j.{Level,Logger}
object mobileInternet {
def main(args: Array[String]) {
val conf = new SparkConf()
.setAppName("WordCount")
.setMaster("local");
val sc = new SparkContext(conf)
//去除过多的日志信息
Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
Logger.getLogger("org.apache.spark,sql").setLevel(Level.WARN)
Logger.getLogger("org.apache.hadoop.hive.ql").setLevel(Level.WARN)
/*
*、一、移动互联网数据字段模型等变量的定义
*/
//定义当前移动互联网数据的字段列表
val fields = List("NodeID","CI","IMEI","APP","Time","UplinkBytes","DownlinkBytes")
//为了避免在每个task任务中传输fields信息,可以对其进行广播
val bcfields = sc.broadcast(fields)
/*NodeID即基站ID信息 CI即小区标识信息 IMEI即国际移动电话设备识别码 APP即应用名称 Time即访问时间 UplinkBytes即上行的字节数 DownlinkBytes即下行的字节数
1,1,460028714280218,360,2015-05-01,7,1116
1,2,460028714280219,qq,2015-05-02,8,121
1,3,460028714280220,yy,2015-05-03,9,122
1,4,460028714280221,360,2015-05-04,10,119
2,1,460028714280222,yy,2015-05-05,5,1119
2,2,460028714280223,360,2015-05-01,12,121
2,3,460028714280224,qq,2015-05-02,13,122
3,1,460028714280225,qq,2015-05-03,1,1117
3,2,460028714280226,qq,2015-05-04,9,1118
3,3,460028714280227,qq,2015-05-05,10,120
1,1,460028714280218,360,2015-06-01,11,1118
1,2,460028714280219,qq,2015-06-02,2,1119
1,3,460028714280220,yy,2015-06-03,9,1120
1,4,460028714280221,360,2015-06-04,10,119
2,1,460028714280222,yy,2015-06-05,11,1118
2,2,460028714280223,360,2015-06-01,11,121
2,3,460028714280224,qq,2015-06-02,4,1119
3,1,460028714280225,qq,2015-06-03,17,119
3,2,460028714280226,qq,2015-06-04,19,1119
3,3,460028714280227,qq,2015-06-05,20,121*/
/*
*、二、移动互联网数据的加载及预处理
*/
//首先加载文件,然后通过判断每行数据的字段个数,对访问记录的有效性进行判断
//加载文件,并将每行记录以逗号分隔,最后根据字段个数进行过滤
val mobile = sc.textFile("./data/mobileInternet.txt").map(_.split(",")).filter{
case line if(line.length != bcfields.value.length) => false
case _ => true
}
/*
* 三、不同的应用使用情况的统计
*/
//对APP字段访问次数的简单统计
// mobile.map( x => (x(bcfields.value.indexOf("APP")),1)).reduceByKey(_+_)
// .map( x => (x._2,x._1)).sortByKey(false).map( x => (x._2,x._1)).collect().foreach(println)
// mobile.map( x => (x(bcfields.value.indexOf("APP")),1)).reduceByKey(_+_)
// .map( x => (x._2,x._1)).sortByKey(false).map( x => (x._2,x._1)).repartition(1).saveAsTextFile("/result/appstat1")
/*
* 四、移动互联网数据上的DAU及MAU的统计
*/
//对 移动互联网数据上的DAU及MAU的统计,需要注意对用户的去重处理:每个用户由字段IMEI唯一标识。统计时需要去除重复用户。
//对DAU字段访问的简单统计
//首先,将IMEI字段和Time字段进行合并,再去重,最后从合并数据中提取出Time字段
// mobile.map( x => (x(bcfields.value.indexOf("IMEI")) + ":" + x(bcfields.value.indexOf("Time"))))
// .distinct().map( x => (x.split(":")(1),1))
// .reduceByKey(_+_).sortByKey().collect().foreach(println)
//对MAU字段访问的简单统计
// mobile.map { x =>
// val t = x(bcfields.value.indexOf("Time"))
// val m = t.substring(0,t.lastIndexOf("-"))
// x(bcfields.value.indexOf("IMEI")) + ":" + m
// }.distinct().map( x => ( x .split(":")(1),1)).reduceByKey(_+_).sortByKey().collect().foreach(println)
/*
* 五、移动互联网数据上的上下行流量的统计
*/
mobile.map { x =>
val ub = x(bcfields.value.indexOf("UplinkBytes")).toDouble
val db = x(bcfields.value.indexOf("DownlinkBytes")).toDouble
(x(bcfields.value.indexOf("APP")),List[Double](ub,db))
}.reduceByKey((x,y) => List(x(0) + y(0) , x(1) + y(1))).collect().foreach(println)
}
}
Spark RDD/Core 编程 API入门系列之简单移动互联网数据(五)的更多相关文章
- Spark RDD/Core 编程 API入门系列 之rdd实战(rdd基本操作实战及transformation和action流程图)(源码)(三)
本博文的主要内容是: 1.rdd基本操作实战 2.transformation和action流程图 3.典型的transformation和action RDD有3种操作: 1. Trandform ...
- Spark RDD/Core 编程 API入门系列之动手实战和调试Spark文件操作、动手实战操作搜狗日志文件、搜狗日志文件深入实战(二)
1.动手实战和调试Spark文件操作 这里,我以指定executor-memory参数的方式,启动spark-shell. 启动hadoop集群 spark@SparkSingleNode:/usr/ ...
- Spark RDD/Core 编程 API入门系列之map、filter、textFile、cache、对Job输出结果进行升和降序、union、groupByKey、join、reduce、lookup(一)
1.以本地模式实战map和filter 2.以集群模式实战textFile和cache 3.对Job输出结果进行升和降序 4.union 5.groupByKey 6.join 7.reduce 8. ...
- Spark RDD/Core 编程 API入门系列 之rdd案例(map、filter、flatMap、groupByKey、reduceByKey、join、cogroupy等)(四)
声明: 大数据中,最重要的算子操作是:join !!! 典型的transformation和action val nums = sc.parallelize(1 to 10) //根据集合创建RDD ...
- Hadoop MapReduce编程 API入门系列之wordcount版本1(五)
这个很简单哈,编程的版本很多种. 代码版本1 package zhouls.bigdata.myMapReduce.wordcount5; import java.io.IOException; im ...
- Hadoop HDFS编程 API入门系列之简单综合版本1(四)
不多说,直接上代码. 代码 package zhouls.bigdata.myWholeHadoop.HDFS.hdfs4; import java.io.IOException; import ja ...
- Spark SQL 编程API入门系列之SparkSQL的依赖
不多说,直接上干货! 不带Hive支持 <dependency> <groupId>org.apache.spark</groupId> <artifactI ...
- Hadoop MapReduce编程 API入门系列之压缩和计数器(三十)
不多说,直接上代码. Hadoop MapReduce编程 API入门系列之小文件合并(二十九) 生成的结果,作为输入源. 代码 package zhouls.bigdata.myMapReduce. ...
- HBase编程 API入门系列之create(管理端而言)(8)
大家,若是看过我前期的这篇博客的话,则 HBase编程 API入门系列之put(客户端而言)(1) 就知道,在这篇博文里,我是在HBase Shell里创建HBase表的. 这里,我带领大家,学习更高 ...
随机推荐
- 实验1“C语言开发环境使用和数据类型、运算符、表达式”总结与体会
一.实验结论 1.判断奇偶 // 程序功能: // 要求用户从键盘输入一个整数,判断其是奇数还是偶数 #include <stdio.h> int main() { int x; prin ...
- hash扩展长度攻击及hashdump使用
摘自: 1.http://www.freebuf.com/articles/web/69264.html 2.https://www.cnblogs.com/pcat/p/5478509.html 0 ...
- android从sdcard中读取bitmap
String sdcard_path=Environment.getExternalStorageDirectory().getCanonicalPath(); String file_path=sd ...
- UIColor用自定义颜色,TableView去掉背景色
1.用mac系统自带的数码测色计,选RGB模式,将值添加到ColorWithRed:xxx.0/255 最后的alpha选1.0 2.TableView的背景色要用setBackgroundView的 ...
- Oracle创建表空间、用户名、密码步骤教程
第一步,以最高级别 SYSDBA 身份登录数据库 cmd 进入命令行 登录方式一: C:\Documents and Settings\Administrator>sqlplus sys/sys ...
- 《Sams Teach Yourself Windows® Workflow Foundation in 24 Hours》读书笔记目录
目录 1 Part I - The Basics 1.1 Hour 1 - Understanding Windows Workflow Foundation 1.2 Hour 2 - A Spin ...
- 怎样在Linux下使用Markdown进行文档工作
怎样在Linux下使用Markdown进行文档工作 在Linux系统中,编辑markdown能够用retext工具: sudo apt-get install retext retext Releas ...
- Java入门 第二季第三章 继承
这是我学习慕课网Java课程的笔记,原视频链接为:http://www.imooc.com/learn/124 3-1 Java 中的继承 ★ 概念:继承是类与类的一种关系,是一种 "is ...
- javascript 将中文符号转换成英文符号
javascript 将中文符号转换成英文符号 CreateTime--2018年3月30日09:01:29 Author:Marydon /** * 将中文符号转换成英文符号 */ functi ...
- 推荐美丽的flash网页MP3音乐播放器
文章来源:PHP开发学习门户 地址:http://www.phpthinking.com/archives/491 在网页制作中.假设想在网页中插入mp3音乐来增添网页的互动感,提升用户体验度,这个时 ...