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

具体包括对不同的应用使用情况的统计、移动互联网上的日常活跃用户(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入门系列之简单移动互联网数据(五)的更多相关文章

  1. Spark RDD/Core 编程 API入门系列 之rdd实战(rdd基本操作实战及transformation和action流程图)(源码)(三)

    本博文的主要内容是: 1.rdd基本操作实战 2.transformation和action流程图 3.典型的transformation和action RDD有3种操作: 1.  Trandform ...

  2. Spark RDD/Core 编程 API入门系列之动手实战和调试Spark文件操作、动手实战操作搜狗日志文件、搜狗日志文件深入实战(二)

    1.动手实战和调试Spark文件操作 这里,我以指定executor-memory参数的方式,启动spark-shell. 启动hadoop集群 spark@SparkSingleNode:/usr/ ...

  3. 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. ...

  4. Spark RDD/Core 编程 API入门系列 之rdd案例(map、filter、flatMap、groupByKey、reduceByKey、join、cogroupy等)(四)

    声明: 大数据中,最重要的算子操作是:join  !!! 典型的transformation和action val nums = sc.parallelize(1 to 10) //根据集合创建RDD ...

  5. Hadoop MapReduce编程 API入门系列之wordcount版本1(五)

    这个很简单哈,编程的版本很多种. 代码版本1 package zhouls.bigdata.myMapReduce.wordcount5; import java.io.IOException; im ...

  6. Hadoop HDFS编程 API入门系列之简单综合版本1(四)

    不多说,直接上代码. 代码 package zhouls.bigdata.myWholeHadoop.HDFS.hdfs4; import java.io.IOException; import ja ...

  7. Spark SQL 编程API入门系列之SparkSQL的依赖

    不多说,直接上干货! 不带Hive支持 <dependency> <groupId>org.apache.spark</groupId> <artifactI ...

  8. Hadoop MapReduce编程 API入门系列之压缩和计数器(三十)

    不多说,直接上代码. Hadoop MapReduce编程 API入门系列之小文件合并(二十九) 生成的结果,作为输入源. 代码 package zhouls.bigdata.myMapReduce. ...

  9. HBase编程 API入门系列之create(管理端而言)(8)

    大家,若是看过我前期的这篇博客的话,则 HBase编程 API入门系列之put(客户端而言)(1) 就知道,在这篇博文里,我是在HBase Shell里创建HBase表的. 这里,我带领大家,学习更高 ...

随机推荐

  1. HDU 1085 多重背包转化为0-1背包问题

    题目大意: 给定一堆1,2,5价值的硬币,给定三个数表示3种价值硬币的数量,任意取,找到一个最小的数无法取到 总价值为M = v[i]*w[i](0<=i<3) 那么在最坏情况下M个数都能 ...

  2. 转载 - C - 枚举类型详解

    出处:http://www.cnblogs.com/JCSU/articles/1299051.html 注:以下全部代码的执行环境为VC++ 6.0 在程序中,可能需要为某些整数定义一个别名,我们可 ...

  3. Error:java: Internal compiler error: java.lang.Exception: java.lang.NoClassDefFoundError解决

    场景:将Eclipse的可以运行的项目转到IDEA发现一个奇怪的错误 今天用IDEA2018.1运行SpringBoot项目报错如下: Error:java: Internal compiler er ...

  4. oracle中的类似BIN$MrkCYT9eTTK+0sStMwn7+Q==$0的表的作用

    https://www.2cto.com/database/201211/166482.html https://docs.oracle.com/cd/E11882_01/server.112/e40 ...

  5. CentOS redis安装配置

    编译依赖安装 yum install gcc-c++ yum install -y tcl 安装步骤 下载:wget http://download.redis.io/releases/redis-5 ...

  6. js事件捕获和冒泡解析

    <div id="box"> <div id="box2"> <p id="test">test< ...

  7. 【分享】迅为iTOP4412开发板-Android系统屏幕旋转设置

    1.1概述 Android4.0,Androd4.4源代码能够编译成手机模式和平板模式,讯为iTop4412 开发平台 的Android系统默认编译为平板模式.客户须要依据自己的产品设计及应用环境,切 ...

  8. Python基础--高速改造:字符串

    Python的字符串值得一说. 先看: >>>"Hello world!" 'Hello world!' 我们写是双引號,可是打印出来后是单引號. 差别何在? 答 ...

  9. ganglia收集hbase的metrics

    Ganglia 是 UC Berkeley 发起的一个开源监视项目,设计用于測量数以千计的节点.每台计算机都执行一个收集和发送度量数据(如处理器速度.内存使用量等)的名为 gmond 的守护进程.它将 ...

  10. shell 字符串拼接 获取自身文件名 日志记录

    shell  字符串拼接 获取自身文件名 日志记录 [root@hadoop2 xiaole_chk_url]# sh a.sh123.loga.sh[root@hadoop2 xiaole_chk_ ...