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

具体包括对不同的应用使用情况的统计、移动互联网上的日常活跃用户(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. [bzoj1004][HNOI2008][Cards] (置换群+Burnside引理+动态规划)

    Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红 ...

  2. Jboss 服务器SSL证书安装指南

    1.获取服务器证书 将证书签发邮件中的从BEGIN到 END结束的服务器证书内容(包括“-----BEGIN CERTIFICATE-----”和“-----END CERTIFICATE-----” ...

  3. 【05】JSON笔记

    [05]笔记           尽管有许多宣传关于 XML 如何拥有跨平台,跨语言的优势,然而,除非应用于 Web Services,否则,在普通的 Web 应用中,开发者经常为 XML 的解析伤透 ...

  4. CodeForces 1000F One Occurrence

    You are given an array $a$ consisting of $n$ integers, and $q$ queries to it. $i$-th query is denote ...

  5. PatentTips - Hamming distance comparison

    BACKGROUND INFORMATION In a typical data processing environment, data may be transmitted in multiple ...

  6. H - Parity game 并查集

    Now and then you play the following game with your friend. Your friend writes down a sequence consis ...

  7. 最小生成树 C - Building a Space Station

    You are a member of the space station engineering team, and are assigned a task in the construction ...

  8. RabbitMQ消息队列阻塞导致服务器宕机

    最近工作中存储服务器由于压力太大无法及时消费消息.这个过程中,导致RabbitMQ意外挂掉,无法访问.下面是部分问题分析过程. 麒麟系统服务器分析 1.服务器异常信息: [root@localhost ...

  9. HDU——1133 Buy the Ticket

    Buy the Ticket Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  10. 大数据分析:结合 Hadoop或 Elastic MapReduce使用 Hunk

    作者 Jonathan Allen ,译者 张晓鹏 Hunk是Splunk公司一款比較新的产品,用来对Hadoop和其他NoSQL数据存储进行探測和可视化,它的新版本号将会支持亚马逊的Elastic ...