Spark获取某个手机号在某个基站下停留的时间和当前手机所在的位置的案例
1、业务需求
在拥有手机号在每个基站处停留时间日志 和 基站信息的 算出某个手机号的(所在基站,停留时间),(当前所在经度,当前所在纬度)
其中手机连接基站产生的日志信息类似如下:
18688888888,20160327082400,16030401EAFB68F1E3CDF819735E1C66,1
18611132889,20160327082500,16030401EAFB68F1E3CDF819735E1C66,1
18688888888,20160327170000,16030401EAFB68F1E3CDF819735E1C66,0
18611132889,20160327180000,16030401EAFB68F1E3CDF819735E1C66,0
上面的含义表示的是:手机号,时间,基站ID,接入网络的类型(0:unknow,1:3G,2:2G,6:4G)
基站信息:
9F36407EAD0629FC166F14DDE7970F68,116.304864,40.050645,6
CC0710CC94ECC657A8561DE549D940E0,116.303955,40.041935,6
16030401EAFB68F1E3CDF819735E1C66,116.296302,40.032296,6
上面的含义表示的是:基站ID,经度,纬度,接入网络的类型(0:unknow,1:3G,2:2G,6:4G)
编写Scale代码:
package com.Hive
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object FD {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("FD").setMaster("local[2]")
val sc = new SparkContext(conf)
//1.读取数据文件
val user =sc.textFile("src/main/data/log/")//用户数据
val base = sc.textFile("src/main/data/base_info.txt")//基站数据
//2.数据清洗工作,数据维度提取
// 用户数据清洗
val splited = user.map(line =>{
val fields = line.split(",")
val phone = fields(0)
val base = fields(2)
val envet = fields(3).toInt
val time = {
if (envet == 1){
-fields(1).toLong//赋值-
}else{
fields(1).toLong//正值+
}
}
((phone,base),time)
})
// splited.collect().foreach(println(_))
// 基站数据清洗
val alcsplited = base.map(line =>{
val fields = line.split(",")
val id = fields(0)
val x = fields(1)
val y = fields(2)
(id,(x,y))
})
// splited.collect().foreach(println(_))
//3.统计每个用户在每个基站中停留的时间
val reducted = splited.reduceByKey(_+_)
// reducted.collect().foreach(println(_))
//((phone,base),time)
val pmt = reducted.map(x=>{
//(基站ID,(手机号,时间))
//x._1对应的是元组((mobile,lac),time)中的(mobile,lac)
//x._2对应的是元组((mobile,lac),time)中的time
((x._1._2),(x._1._1,x._2))
})
//连接join 之后的结果[(基站ID,((手机号,时间),(经度,纬度)))]
val joined:RDD[(String, ((String, Long), (String, String)))] = pmt.join(alcsplited)
//按照手机号进行分组
//_. :代表的是基站 手机号,时间,经度,纬度
//_._2 :代表的是 手机号,时间 经度,纬度
//_._2_1 :代表的是 手机号,时间
//_._2._1._ :代表的是 手机号
val MobileGroupBykey = joined.groupBy(_._2._1._1)
val result = MobileGroupBykey.mapValues(_.toList.sortBy(_._2._1._2).reverse.take(2))
println(result.collect().toBuffer)
sc.stop()
}
}
Spark获取某个手机号在某个基站下停留的时间和当前手机所在的位置的案例的更多相关文章
- 使用Scala编写Spark程序求基站下移动用户停留时长TopN
使用Scala编写Spark程序求基站下移动用户停留时长TopN 1. 需求:根据手机基站日志计算停留时长的TopN 我们的手机之所以能够实现移动通信,是因为在全国各地有许许多多的基站,只要手机一开机 ...
- 我终于搞清楚为什么谷歌地图获取到的联通3G基站与大家手头的基站表不同了
我终于搞清楚这个问题了,大家使用谷歌地图手机版.MobileTrack以及网优用的FieldTest获取到的WCDMA基站Cellid为什么不是大家手头的CellTrack91或基站表里的数字了... ...
- uniapp 获取用户手机号
参考资料: 微信小程序官方文档 uniapp开发微信小程序获取用户手机号 页面增加一个按钮 <button open-type="getPhoneNumber" @getph ...
- Spark Streaming揭秘 Day31 集群模式下SparkStreaming日志分析(续)
Spark Streaming揭秘 Day31 集群模式下SparkStreaming日志分析(续) 今天延续昨天的内容,主要对为什么一个处理会分解成多个Job执行进行解析. 让我们跟踪下Job调用过 ...
- Spark Streaming揭秘 Day30 集群模式下SparkStreaming日志分析
Spark Streaming揭秘 Day30 集群模式下SparkStreaming日志分析 今天通过集群运行模式观察.研究和透彻的刨析SparkStreaming的日志和web监控台. Day28 ...
- 微信小程序获取用户手机号详解
最近在做一款微信小程序,需要获取用户手机号,具体步骤如下: 流程图: 1.首先,客户端调用wx.login,回调数据了包含jscode,用于获取openid(用户唯一标识)和sessionkey(会话 ...
- JS/JQuery获取当前元素的上一个/下一个兄弟级元素等元素的方法
$(function(){ //遍历获取的input元素对象数组,绑定click事件 var len = $("input[type='file']").length; ; i & ...
- SQL Server 获取满足条件的每个条件下的前N条数据
从数据库获取数据时,经常会遇到获取一个数据列表和该列表中每条数据对应的另一个列表的情况,如果二级列表获取的是全部数据,那么就比较简单.如果二级列表获取的是前n条数据,就会比较麻烦. 从操作上来看,好像 ...
- Spark获取DataFrame中列的方式--col,$,column,apply
Spark获取DataFrame中列的方式--col,$,column,apply 1.官方说明 2.使用时涉及到的的包 3.Demo 原文作者:大葱拌豆腐 原文地址:Spark获取DataFrame ...
随机推荐
- selenium自动化一点记录
UI自动化 1.webdriver的findElement方法可以查找页面某元素,通常使用方式是通过id和name进行查找 1.By ID根据id进行定位 WebElement element=dri ...
- Unity操作小技巧
1.操作类 1)F:选择物体后聚焦 2)V:选择物体的顶点,顶点吸附 3)Ctrl:摁住后拖动物体,可以按照系统设置的步长进行移动(Edit -> Snap setting) 4)Q W E R ...
- Java开发工程师(Web方向) - 04.Spring框架 - 第3章.AOP技术
第3章--AOP技术 Spring框架 - AOP概述 笔记https://my.oschina.net/hava/blog/758873Spring框架 - AOP使用 笔记https://my.o ...
- node事件循环
Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高. Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发. Node.j ...
- python selenium 使用htmlunit 执行测试。非图形界面浏览器。
其实就是换个浏览器,只是这个浏览器没有图形界面而已. browser = webdriver.Chrome() 换成 browser = webdriver.Remote(desired_capabi ...
- gitolite 丢失管理密钥/访问权限 解决办法
登录到服务器. 使用完整路径克隆管理员仓库: git clone $HOME/repositories/gitolite-admin.git temp cd gitolite-admin/conf v ...
- appium关键字:
## Appium 服务关键字 <expand_table> |关键字|描述|实例||----|-----------|-------||`automationName`|你想使用的自动化 ...
- JavaScriptSerializer的实现-常用JsonHelper类
最近开始自己写自己的项目了,终于鼓起勇气迈出了自己认为的这一大步! 先来通用的helper类和大家分享一下 ,第一个是Object转为json序列的类,这个网上有很多,但我实践了一下大部分都不能用的, ...
- 线性代数之——正交矩阵和 Gram-Schmidt 正交化
这部分我们有两个目标.一是了解正交性是怎么让 \(\hat x\) .\(p\) .\(P\) 的计算变得简单的,这种情况下,\(A^TA\) 将会是一个对角矩阵.二是学会怎么从原始向量中构建出正交向 ...
- 浅谈CPU、内存、硬盘之间的关系
计算机,大家都知道的,就是我们日常用的电脑,不管台式的还是笔记本都是计算机.那么这个看着很复杂的机器由哪些组成的呢,今天就简单的来了解一下. 先放图: 图上展示的就是计算机的基本组成啦. 首先是输入设 ...