简单移动互联网数据入门案例

  通过对移动互联网数据的分析,了解移动终端在互联网上的行为以及各个应用在互联网上的发展情况等信息。

具体包括对不同的应用使用情况的统计、移动互联网上的日常活跃用户(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)

}

}

时间: 2024-08-02 04:29:03

简单移动互联网数据入门案例的相关文章

_00019 Storm的体系结构介绍以及Storm入门案例(官网上的简单Java案例)

博文作者:妳那伊抹微笑 博客地址:http://blog.csdn.net/u012185296 个性签名:世界上最遥远的距离不是天涯,也不是海角,而是我站在妳的面前,妳却感觉不到我的存在 技术方向:Flume+Kafka+Storm+Redis/Hbase+Hadoop+Hive+Mahout+Spark ... 云计算技术 转载声明:可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明,谢谢合作! qq交流群:214293307  (期待与你一起学习,共同进步) # Storm

_00017 Flume的体系结构介绍以及Flume入门案例(往HDFS上传数据)

博文作者:妳那伊抹微笑 个性签名:世界上最遥远的距离不是天涯,也不是海角,而是我站在妳的面前,妳却感觉不到我的存在 技术方向:hadoop,数据分析与挖掘 转载声明:可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明,谢谢合作! qq交流群:214293307  (期待与你一起学习,共同进步) # 学习前言 想学习一下Flume,网上找了好多文章基本上都说的很简单,只有一半什么的,简直就是坑爹,饿顿时怒火就上来了,学个东西真不容易,然后自己耐心的把这些零零碎碎的东西整理整理,各种

ActiveMQ入门案例以及整合Spring的简单实用

先来个ActiveMQ介绍哈: MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法,是一个消息中间件. 应用场景:为了实现系统之间的通信,把系统之间的调用耦合度降低就可以使用MQ. 1) activeMQ 是Apache出品,最流行的,能力强劲的开源消息总线. 2) avtiveMQ主要特点:完全支持JMS1.1和J2EE 1.4规范:支持spring,很容易内嵌到spring中:支持ajax. 3) activeMQ的消息形式: a) 点对点形式,即生产

springcloud+eureka简单入门案例

springcloud+eureka简单入门案例 一.服务提供者 直接提供服务,入门案例没有特别要设置的地方,注意下端口,由于要启动多个服务,可能会冲突 配置文件(src/main/resources/application.yml) server: port: 8000 二.服务消费者 服务消费者的依赖在这个单独的demo中其实可有可无,亲测不添加,也可以实现demo服务提供能 三.服务消费者启动类里注入RestTemplate,用于调用远程服务 import org.springframew

Mybatis入门案例中设计模式的简单分析

Talk is cheap, show me the code! public class TestMybatis { public static void main(String[] args) throws IOException { //1. 读取配置文件 InputStream resource = Resources.getResourceAsStream("mybatis.xml"); //2. 创建sqlSessionFactory工厂 SqlSessionFactory

互联网协议入门(一)

转:http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html 我们每天使用互联网,你是否想过,它是如何实现的? 全世界几十亿台电脑,连接在一起,两两通信.上海的某一块网卡送出信号,洛杉矶的另一块网卡居然就收到了,两者实际上根本不知道对方的物理位置,你不觉得这是很神奇的事情吗? 互联网的核心是一系列协议,总称为"互联网协议"(Internet Protocol Suite).它们对电脑如何连接和组

一起学习Hibernate: Hibernate01 —— Hibernate的概述与入门案例

一 Hibernate的介绍 1 让我们从JDBC与替代它的框架Hibernate进行一下对比. 1.1 JDBC的缺点 1) 代码结构繁琐.每次书写sql语句操作数据库都得需要很多步; 2) 是面向过程的编程,而非面向对象的: 3) 没有做到数据缓存.这会导致程序与数据库的交互的次数很多: 4) 因为事务是自动开启的,所以存在安全隐患. 1.2 JDBC的优点 1) 因为是底层的数据库操作,所以执行效率很高: 2) sql语句可以自己编写,可以进行优化从而选择效率最高的那些. 1.3 Hibe

_00017 Kafka的体系结构介绍以及Kafka入门案例(初级案例+Java API的使用)

博文作者:妳那伊抹微笑 个性签名:世界上最遥远的距离不是天涯,也不是海角,而是我站在妳的面前,妳却感觉不到我的存在 技术方向:Flume+Kafka+Storm+Redis/Hbase+Hadoop+Hive+Mahout+Spark ... 云计算技术 转载声明:可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明,谢谢合作! qq交流群:214293307  (期待与你一起学习,共同进步) # Kfaka的体系结构 # 学习前言 Kafka的整个学习过程就是自己看官网的文档,出

ArcGIS for Desktop入门教程_第四章_入门案例分析 - ArcGIS知乎-新一代ArcGIS问答社区

原文:ArcGIS for Desktop入门教程_第四章_入门案例分析 - ArcGIS知乎-新一代ArcGIS问答社区 1 入门案例分析 在第一章里,我们已经对ArcGIS系列软件的体系结构有了一个全面的了解,接下来在本章中,将通过一个案例来熟悉ArcGIS for Desktop的使用,从解决问题的过程中,逐渐适应ArcGIS桌面的界面和操作方式. 本章的练习数据是一个住宅小区的简单平面示意图,需要在已有的基础上把楼房的轮廓补充完整,并加以整饰,完成一幅地图. 1.1 打开地图文档并浏览