用Spark开发基站停留时间Top2

美图欣赏:
在这里插入图片描述
一.介绍

根据用户产生日志的信息,在那个基站停留时间最长 19735E1C66.log 这个文件中存储着日志信息 文件组成:手机号,时间戳,基站ID连接状态(1连接 0断开) lac_info.txt 这个文件中存储基站信息 文件组成 基站ID, 经,纬度在一定时间范围内,求所用户经过的所有基站所停留时间最长的

Top2 思路:

1.获取用户产生的日志信息并切分
2.用户在基站停留的总时长
3.获取基站的基础信息
4.把经纬度的信息join到用户数据中
5.求出用户在某些基站停留的时间top2

二.数据格式

1.log字段表示:

手机号 时间戳 基站ID 连接状态
在这里插入图片描述
2.lac_info.txt字段表示
基站ID 经度 纬度 停留时间

在这里插入图片描述

三.代码实现

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object LacLocation {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("location").setMaster("local[2]")
    val sc = new SparkContext(conf)

    // 获取用户访问数据
    val logs = sc.textFile("D:\\input\\lacduration\\log")

    // 切分用户数据
    val userInfo: RDD[((String, String), Long)] = logs.map(line => {
      val fields = line.split(",")
      val phone = fields(0)
      val time = fields(1).toLong
      val lac = fields(2)
      val eventType = fields(3)
      // 判断时间是否是建立会话时间,如果是,前面加“-”,如果不是,原样返回,这样方便以后统计时长
      val time_long = if (eventType.equals("1")) -time else time

      ((phone, lac), time_long)
    })

    // 统计每个用户在所有基站停留的总时长
    val aggred: RDD[((String, String), Long)] = userInfo.reduceByKey(_+_)

    // 整合数据,方便将基站信息join过来
    val lacAndPhoneAndTime: RDD[(String, (String, Long))] = aggred.map(tup => {
      val phone = tup._1._1
      val lac = tup._1._2
      val time = tup._2
      (lac, (phone, time))
    })

    // 获取基站信息
    val lacInfo = sc.textFile("D:\\input\\lacduration\\lac_info.txt")
      .map(line => {
        val fields = line.split(",")
        val lac = fields(0)
        val lang = fields(1)
        val lat = fields(2)
        (lac, (lang, lac))
      })

    // 将聚合后的用户信息和基站信息进行join
    val joined: RDD[(String, ((String, Long), (String, String)))] = lacAndPhoneAndTime join lacInfo

    // 整合数据,方便按照手机号进行分组并排序
    val phoneAndTimeAndLangLat: RDD[(String, (Long, (String, String)))] = joined.map(tup => {
      val phone = tup._2._1._1
      val time = tup._2._1._2
      val langAndLat = tup._2._2

      (phone, (time, langAndLat))
    })

    // 按照手机号进行分组
    val grouped: RDD[(String, Iterable[(Long, (String, String))])] =
      phoneAndTimeAndLangLat.groupByKey()

    // 组内排序
    val res: RDD[(String, List[(Long, (String, String))])] =
      grouped.mapValues(_.toList.sortWith(_._1 > _._1).take(2))

    res.foreach(println)

    sc.stop()
  }
}

打印结果:
在这里插入图片描述

             ————保持饥饿,保持学习
                  Jackson_MVP
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SuperBigData~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值