Spark获取某个手机号在某个基站下停留的时间和当前手机所在的位置的案例
生活随笔
收集整理的這篇文章主要介紹了
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)
2、創建Maven工程。
創建過程參考:http://blog.csdn.net/tototuzuoquan/article/details/74571374,目錄結構和Pom文件和這個里面的代碼一樣。
3、編寫Scale代碼:
package cn.toto.sparkimport org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext}/*** Created by toto on 2017/7/7.*/ object MobileLocation {def main(args: Array[String]): Unit = {val conf = new SparkConf().setAppName("MobileLocation").setMaster("local")val sc = new SparkContext(conf)val lines : RDD[String] = sc.textFile(args(0))//切分lines.map(_.split(",")).map(arr => (arr(0), arr(1).toLong, arr(2), args(3)))val splited = lines.map(line => {val fields = line.split(",")val mobile = fields(0)val lac = fields(2)val tp = fields(3)//如果是建立連接的val time = if(tp == "1") -fields(1).toLong else fields(1).toLong//拼接數據,某個手機號在某個基站下停留的時間,下面的會返回放到基站里面// ((基站,位置),時間)((mobile, lac), time)})//分組聚合(計算某個手機號在某個基站下所有停留的時間)val reduced : RDD[((String,String),Long)] = splited.reduceByKey(_+_)val lmt = reduced.map(x => {//(基站ID,(手機號,時間))//x._1對應的是元組 ((mobile, lac), time)中的(mobile,lac)//x._2對應的是元組 ((mobile, lac), time)中的time(x._1._2, (x._1._1, x._2))})//連接,數據局val lacInfo : RDD[String] = sc.textFile(args(1))//整理基站數據val splitedLacInfo = lacInfo.map(line => {val fields = line.split(",")//id做為key(基站ID)val id = fields(0)//經度val x = fields(1)//緯度val y = fields(2)//(基站ID,(經度,緯度))(id, (x, y))})//連接join之后的結果是: [(基站ID,((手機號,時間),(經度,緯度)))]val joined: RDD[(String, ((String, Long), (String, String)))] = lmt.join(splitedLacInfo)//按照手機號進行分組//_. :代表的是(基站ID,((手機號,時間),(經度,緯度)))//_._2 :代表的是 ((手機號,時間),(經度,緯度))//_._2_1 :代表的是 (手機號,時間)//_._2._1._1 : 代表的是 手機號val groupedByMobile = joined.groupBy(_._2._1._1)val result = groupedByMobile.mapValues(_.toList.sortBy(_._2._1._2).reverse.take(2))println(result.collect().toBuffer)sc.stop()} }4、準備數據
位置E:\mobileLocation:
其中E:\mobileLocation\loc_info\loc_info.txt:
19735E1C66.log:
18688888888,20160327082400,16030401EAFB68F1E3CDF819735E1C66,1 18611132889,20160327082500,16030401EAFB68F1E3CDF819735E1C66,1 18688888888,20160327170000,16030401EAFB68F1E3CDF819735E1C66,0 18611132889,20160327180000,16030401EAFB68F1E3CDF819735E1C66,0DDE7970F68.log
18611132889,20160327075000,9F36407EAD0629FC166F14DDE7970F68,1 18688888888,20160327075100,9F36407EAD0629FC166F14DDE7970F68,1 18611132889,20160327081000,9F36407EAD0629FC166F14DDE7970F68,0 18688888888,20160327081300,9F36407EAD0629FC166F14DDE7970F68,0 18688888888,20160327175000,9F36407EAD0629FC166F14DDE7970F68,1 18611132889,20160327182000,9F36407EAD0629FC166F14DDE7970F68,1 18688888888,20160327220000,9F36407EAD0629FC166F14DDE7970F68,0 18611132889,20160327230000,9F36407EAD0629FC166F14DDE7970F68,0E549D940E0.log
18611132889,20160327081100,CC0710CC94ECC657A8561DE549D940E0,1 18688888888,20160327081200,CC0710CC94ECC657A8561DE549D940E0,1 18688888888,20160327081900,CC0710CC94ECC657A8561DE549D940E0,0 18611132889,20160327082000,CC0710CC94ECC657A8561DE549D940E0,0 18688888888,20160327171000,CC0710CC94ECC657A8561DE549D940E0,1 18688888888,20160327171600,CC0710CC94ECC657A8561DE549D940E0,0 18611132889,20160327180500,CC0710CC94ECC657A8561DE549D940E0,1 18611132889,20160327181500,CC0710CC94ECC657A8561DE549D940E0,05、IDEA中配置輸入參數:
6、運行結果:
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Spark获取某个手机号在某个基站下停留的时间和当前手机所在的位置的案例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spark rdd 介绍,和案例介绍
- 下一篇: 港股恒生指数交易时间