美文网首页
spark第二天作业

spark第二天作业

作者: 吾为天帝乎 | 来源:发表于2018-11-07 22:46 被阅读4次

    基站数据分析案例

    [TOC]

    本节任务

    场景解读练习
    数据维度分析

    教学目标

    使用案例练习Spark算子
    通过基站数据判断用户工作地址

    教学内容

    一、场景描述

    手机用户通过基站进行通信,同时,基站可以获取到当前在线的用户。可以通过基站中的事件状态标识用户的进入和离开,从而可以获得用户在基站中的停留时长,而基站本身具有地理位置的信息,可以进而确定用户的位置

    二、数据描述

    1. 基站数据

    • 基站ID
    • 经度
    • 纬度
    • 信号类型

    2. 用户数据

    • 手机号
    • 时间戳
    • 基站ID
    • 事件类型(1->进入,0->离开)

    3. 样例数据

    • 基站数据
    9F36407EAD0629FC166F14DDE7970F68,116.304864,40.050645,6
    CC0710CC94ECC657A8561DE549D940E0,116.303955,40.041935,6
    16030401EAFB68F1E3CDF819735E1C66,116.296302,40.032296,6
    
    • 用户数据
    18688888888,20160327082400,16030401EAFB68F1E3CDF819735E1C66,1
    18101056888,20160327082500,16030401EAFB68F1E3CDF819735E1C66,1
    18688888888,20160327170000,16030401EAFB68F1E3CDF819735E1C66,0
    18101056888,20160327180000,16030401EAFB68F1E3CDF819735E1C66,0
    18101056888,20160327075000,9F36407EAD8829FC166F14DDE7970F68,1
    18688888888,20160327075100,9F36407EAD8829FC166F14DDE7970F68,1
    18101056888,20160327081000,9F36407EAD8829FC166F14DDE7970F68,0
    18688888888,20160327081300,9F36407EAD8829FC166F14DDE7970F68,0
    18688888888,20160327175000,9F36407EAD8829FC166F14DDE7970F68,1
    18101056888,20160327182000,9F36407EAD8829FC166F14DDE7970F68,1
    18688888888,20160327220000,9F36407EAD8829FC166F14DDE7970F68,0
    18101056888,20160327230000,9F36407EAD8829FC166F14DDE7970F68,0
    18101056888,20160327081100,CC0710CC94ECC657A8561DE549D940E0,1
    18688888888,20160327081200,CC0710CC94ECC657A8561DE549D940E0,1
    18688888888,20160327081900,CC0710CC94ECC657A8561DE549D940E0,0
    18101056888,20160327082000,CC0710CC94ECC657A8561DE549D940E0,0
    18688888888,20160327171000,CC0710CC94ECC657A8561DE549D940E0,1
    18688888888,20160327171600,CC0710CC94ECC657A8561DE549D940E0,0
    18101056888,20160327180500,CC0710CC94ECC657A8561DE549D940E0,1
    18101056888,20160327181500,CC0710CC94ECC657A8561DE549D940E0,0
    

    三、需求分析

    根据事件类型以及时间戳做时间运算,确定用户在基站中的停留时间,在每一天的基站数据中取出停留时间最长的两组基站数据,进而确定用户的工作地点以及住址

    四、实现过程

    import org.apache.spark.rdd.RDD
    import org.apache.spark.{SparkConf, SparkContext}
    
    object Mobile {
      def main(args: Array[String]): Unit = {
        // 0.初始化
        val sparkConf = new SparkConf().setAppName("Master").setMaster("local[*]")
        val sc = new SparkContext(sparkConf)
        // 1.读取数据
        val userData: RDD[String] = sc.textFile("E://log")
        val baseInfo: RDD[String] = sc.textFile("E://base_info.txt")
        // 2.数据清洗
        val phoneBaseWithTime: RDD[((String, String), Long)] = userData.map(line => {
          val fields = line.split(",")
          val phone = fields(0) // 手机号
          var time = fields(1).toLong // 时间戳
          val base = fields(2) // 基站ID
          val event = fields(3).toInt // 事件类型
          time = if (event == 1) -time else time
          ((phone, base), time)
        })
        val baseWithXY: RDD[(String, (String, String))] = baseInfo.map(line => {
          val fields = line.split(",")
          val base = fields(0) // 基站ID
          val x = fields(1) // 经度
          val y = fields(2) // 纬度
          (base, (x, y))
        })
        // 3.计算用户停留在基站时间总和
        val phoneBaseWithSumTime: RDD[((String, String), Long)] = phoneBaseWithTime.reduceByKey(_ + _)
        // 4.将基站的经纬度引入
        val baseWithPhoneSumTime: RDD[(String, (String, Long))] = phoneBaseWithSumTime.map(content => {
          val phone = content._1._1
          val base = content._1._2
          val time = content._2
          (base, (phone, time))
        })
        val data: RDD[(String, ((String, Long), (String, String)))] = baseWithPhoneSumTime.join(baseWithXY)
        // 5.按手机号分组,同时按时间排序
        val result: RDD[(String, List[(String, Long,(String, String))])] = data.map(content => {
          val base = content._1 // 基站ID
          val phone = content._2._1._1 // 手机号
          val time = content._2._1._2 // 停留时间
          val xy = content._2._2 // 经纬度
          (phone,time,xy)
        }).groupBy(_._1).mapValues(_.toList.sortWith(_._2 > _._2).take(2))
        // 6.输出结果
        result.foreach(println)
        // 运行结果
        // (18101056888,List((18101056888,97500,(116.296302,40.032296)), (18101056888,54000,(116.304864,40.050645))))
        // (18688888888,List((18688888888,87600,(116.296302,40.032296)), (18688888888,51200,(116.304864,40.050645))))
        sc.stop()
      }
    }
    

    相关文章

      网友评论

          本文标题:spark第二天作业

          本文链接:https://www.haomeiwen.com/subject/srnbxqtx.html