• 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)


    }

    }

  • 相关阅读:
    3D开发基础知识和简单示例
    六大设计原则详解
    InnoSetup 根据选择的安装语言显示不同语言的(协议)License和更新说明
    ASP.NET Core如何在.NET Core中构建和运行时禁用浏览器启动
    DevExpress 设置DateEdit显示年月季度
    DevExpress设置单元格不可编辑,选单元格则选中一行
    sql server数据库只有mdf文件,没有ldf,如何加载
    .net core 整洁架构入门
    在ASP.NET Core使用Entity Framework Core的日志显示sql语句
    在ASP.NET Core使用Entity Framework Core的日志
  • 原文地址:https://www.cnblogs.com/zlslch/p/6128161.html
Copyright © 2020-2023  润新知