spark 基站時長統計

2021-08-19 23:54:33 字數 4638 閱讀 1042

綜合練習:通過基站資訊計算家庭位址和工作位址

需求:根據手機訊號來計算其所在的位置

手機一開機,就會和附近的基站建立連線,建立連線和斷開連線都會被記錄到伺服器上的日誌,

所以即使沒手機有開啟網路或者gps,也可以定位手機所在的位置。基站都有一定的輻射範圍,

並且根據訊號強度有不同的訊號級別,比如2g、3g和4g訊號。

我們雖然不知道手機使用者所在的具體位置,但是我們知道基站的位置,手機使用者一旦進入基站的

輻射範圍,手機就會和基站之間建立連線。我們就可以計算使用者大致的位置。我們就可以根據這

些位置資訊做一些推薦廣告。比如附近的商家,你可能喜歡的商品或者服務。

假如現在我們得到了一些位置資料,比如有手機號、建立連線的標記(比如1)、斷開連線的標記(比如0)、

建立連線的時間戳、斷開連線的時間戳等字段。用斷開連線的時間減去建立連線的時間就是使用者在該基站下

停留的時間。但是這種計算方式不是很好,因為在實際中使用者可能會停留好幾天的情況,或者說有建立連線但是

沒有斷開連線的情況。所以這裡面其實還會有乙個會話的概念。

其實基站不是一直保持連線的,它可能每隔一段時間他會自動斷開一次。比如每隔一天就斷開一次。

每個基站都有乙個基站id,這是乙個uuid。所以可能還會乙個和基站相關的基站表,比如基站的id和經緯度等資訊。

我們應該將兩個表進行join才能得到使用者在基站下停留的時間等資訊。

這裡我們先不考慮會話id的概念。我們這裡只是求某個使用者白天和晚上等某個時間段停留時間的從高到低進行排序。

比如早晨8點到晚上6點之間停留時間最長的我們可以認為是使用者的工作地點。相反,在晚上6點到第二天早上8點這段時間

中停留時間最長的我們就認為是使用者的住所。

知道了使用者的工作地點和住處,我們就可以做一些推薦了。

但是還有乙個問題是,乙個使用者可能在一天中會經過幾十甚至上百個基站。我們怎麼才能知道它在哪個基站下面停留的時間最長呢?

而且還有乙個問題,乙個使用者在同乙個基站下路過還不止一次。比如某使用者,在他公司和家之間有乙個基站,他早上上班時路過某基站一次,

中午回家又路過一次,晚上下班又路過一次。這樣,他就會在同乙個基站中路過很多次。這樣在基站的伺服器日誌中就會記錄很多條資料。

我們現在要計算使用者在哪個基站下停留時間最長,其實就是簡單的資料切分,然後進行求和,然後進行join。

為了便於理解,我們模擬了一些簡單的日誌資料,共4個字段:手機號碼,時間戳,基站id,連線型別(1表示建立連線,0表示斷開連線):

基站a:

[plain] 

view plain

copy

18688888888,20160327082400,16030401eafb68f1e3cdf819735e1c66,1  

18611132889,20160327082500,16030401eafb68f1e3cdf819735e1c66,1  

18688888888,20160327170000,16030401eafb68f1e3cdf819735e1c66,0  

18611132889,20160327180000,16030401eafb68f1e3cdf819735e1c66,0  

基站b:

[plain] 

view plain

copy

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,0  

基站c:

[plain] 

view plain

copy

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,0  

下面是基站表的資料,共4個字段,分別代表基站id和經緯度以及訊號的輻射型別(比如2g訊號、3g訊號和4g訊號):

[plain] 

view plain

copy

9f36407ead0629fc166f14dde7970f68,116.304864,40.050645,6  

cc0710cc94ecc657a8561de549d940e0,116.303955,40.041935,6  

16030401eafb68f1e3cdf819735e1c66,116.296302,40.032296,6  

基於以上3個基站的日誌資料,要求計算某個手機號碼在一天之內出現最多的兩個地點。

因為乙個手機號碼可能一天當中可能會經過很多的基站,可能他在家停留了10個小時,在公司停留了8個小時,還有可能坐車的時候路過了一些基站。

思路:求每個手機號碼在哪些基站下面停留的時間最長,在計算的時候,用"手機號碼+基站"才能定位在哪個基站下面停留的時間,

因為每個基站下面會有很多的使用者的日誌資料。

全國有很多的基站,每個電信分公司只負責計算自己的資料。資料存放在基站下面的機房的伺服器上。

一般是用過一些工具通過網路把這些資料蒐集過來。蒐集過來的資料量可能會很大,

這些資料一般會存放到分布式的檔案系統中,比如存放到hdfs中。

我們可能會基於一周或者乙個月的資料量來計算,時間跨度越大,計算出來的結構就越精確。

相關資料在"spark資料"中。

重要:寫好的spark程式,如果我不想每次都提交到spark集群上面執行,可以在

程式中指定"在本地執行模式",也就是如下方式:

它表示要在本地模擬乙個程式來執行,它並沒有把它提交到集群。

但是,這種方式在linux和mac系統中沒有問題,而在windows下會有異常。

因為我們的spark程式要從hdfs中讀資料,所以它要用到hadoop的inputformat來

讀資料,如果要在windows下面進行本地除錯,需要做一些事情。

我們知道hadoop要壓縮和解壓縮,那麼壓縮和解壓縮所需要的都是一些c或c++編寫的庫,

而這些c或c++編寫的庫檔案是不跨平台的。所以要在windows下面除錯就必須先把這些庫安裝好。

我們建議在linux下面進行除錯,如果你沒有mac系統的話,可以在linux虛擬機器上

安裝乙個idea開發工具?使用linux的圖形介面來除錯。

下面是完整的**:

[plain] 

view plain

copy

import org.apache.spark.rdd.rdd  

import org.apache.spark.  

object mobilelocation )  

//分組聚合  

val reduced : rdd[((string, string), long)] = splited.reducebykey(_+_)  

val lmt = reduced.map(x => )  

//連線  

val lacinfo: rdd[string] = sc.textfile(args(1))  

//整理基站資料  

val splitedlacinfo = lacinfo.map(line => )  

//連線jion  

val joined: rdd[(string, ((string, long), (string, string)))] = lmt.join(splitedlacinfo)  

println(joined.collect().tobuffer)  

sc.stop()  

}  }  

統計各個函式的耗時 iOS App啟動時長統計方法

常見的 ios 啟動時長測試方法,主要有以下幾種 方法 2 可以精確獲取各個啟動項耗時,但和實際使用者體驗感受有一定出入,且需要拿到客戶端原始碼,將工具嵌入客戶端中 xrecord安裝 git clone,找到bin xrecord 檢視mac上可錄製裝置 xrecord quicktime lis...

站長統計載入慢解決方法

用延遲載入解決cnzz載入慢的問題 我是不太喜歡cnzz的,不過既然公司要用,還是得加,這個公司不知道為什麼不好好優化一下,這麼多功能都做了,難道不願意多費幾分鐘優化一下這個特別影響使用者體驗的統計 現在的移動站頁面,是有載入提示浮層的,要在頁面載入完畢後,才會將浮層撤銷,結果cnzz動不動載入超時...

shell統計介面響應時長

1.將介面響應時長輸出到檔案 讀取介面檔案,統計每個介面響應耗時,計算平均值,輸出到檔案。bin bash paths cat path file echo 介面響應耗時統計 path time.log for path in paths do echo n path path time.log e...