Spark案例練習-PV的統計

關注公衆號:分享電腦學習
回覆"百度雲盤" 可以免費獲取所有學習文檔的代碼(不定期更新)

雲盤目錄說明:

tools目錄是安裝包
res   目錄是每一個課件對應的代碼和資源等
doc  目錄是一些第三方的文檔工具

承接上一篇文檔《Spark應用的結構

參數說明:

Spark案例練習-PV的統計

 

創建一個Maven項目

Pom文件引入jar,配置信息已經完成,大家可以直接去網盤下載,版本號根據自己的安裝情況調整

部分示例

Spark案例練習-PV的統計

 

創建一個scala文件,編寫代碼

1. 構建SparkContext上下文對象

val conf = new SparkConf()
val sc = new SparkContext(conf)

此時可以運行這兩行代碼

Spark案例練習-PV的統計

 

會出現錯誤

Spark案例練習-PV的統計

 

需要添加一行代碼

setMaster("local")// 指定應用在哪兒執行,可以是local、或者stadnalone、yarn、mesos集羣

Spark案例練習-PV的統計

 

再運行一次

又報一次錯,這個是要求指定應用的名字

Spark案例練習-PV的統計

 

添加代碼

.setAppName("pvtest") //指定應用的名字

Spark案例練習-PV的統計

 

再運行就可以了(啓動hadoop)

2. 基於sc構建RDD

端口爲core-site.xml中配置的

Spark案例練習-PV的統計

 

將文件上傳到指定目錄

Spark案例練習-PV的統計

 

val path = "hdfs://ip:8020/data/page_views.data" //HDFS的schema 給定數據的路徑
val rdd: RDD[String] = sc.textFile(path)
println("總共有" + rdd.count()+ "條數據")

Spark案例練習-PV的統計

 

運行可以看到顯示

Spark案例練習-PV的統計

 

如果不想寫schema的話,需要將hadoop的兩個文件拷貝到項目的src/main/resources中

兩個文件是hadoop的:hdfs-site.xml和core-site.xml

Spark案例練習-PV的統計

 

編寫代碼

val path = /data/page_views.data

Spark案例練習-PV的統計

 

運行也可以查看到結果

3. 業務實現

思路:

(1)分析可知道:數據分爲7個字段,業務需要三個字段(時間,URL,guid),計算某一個時間的PV的值
(2)數據進行過濾清洗,獲取兩個字段(時間、url)
(3)url非空,時間非空,時間字符串的長度必須大於10
(4)sql: select date, count(url) from page_view group by date;
(5)sql: select date, count(1) from page_view group by date;
(6)分別用reduceByKey和groupByKey進行數據處理

我們一步步來

先分割數據

val rdd1 = rdd.map(line => line.split("\t"))

數據進行過濾清洗,獲取兩個字段(時間、url)

url非空,時間非空,時間字符串的長度必須大於10

.filter(arr => {
//保留正常數據
arr.length >2 && arr(1).trim.nonEmpty && arr(0).trim.length > 10
})

截取數據

.map(arr => {
val date = arr(0).trim.substring(0,10)
val url = arr(1).trim
(date,1) // (date,url)
})

 

 

基於reduceByKey做統計pv

val pvRdd = rdd1.reduceByKey(_+_)
println("pv------------------" + pvRdd.collect().mkString(";"))

數據表示2013年5月19日一共有100000條訪問數據

Spark案例練習-PV的統計

 

也可以基於groupByKey實現pv統計(這個可以試一下,如果不行就使用reduceByKey)

groupByKey相當於把相同的key的value放到迭代器裏面,也就是這些value都放到內存裏面,如果value值數據量撐爆內存,就會OOM異常

val pvRdd = rdd1.groupByKey()
.map(t => {
val date = t._1
val pv = t._2.size
(date,pv)
})
println("pv------------------" + pvRdd.collect().mkString(";"))

與上面值相同

Spark案例練習-PV的統計

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章