Spark_RDD实现页面跳转率计算

该博客展示了如何利用Apache Spark进行数据处理,计算特定页面间跳转的转换率。首先,从文件中读取数据并进行预处理,然后通过过滤和分组操作计算分母和分子,接着对数据进行分组、排序和滑动窗口处理,最后计算单跳转换率并输出结果。
摘要由CSDN通过智能技术生成

package com.rdd.topn

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
//城市 id

object PageflowAnalysis2 {
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setMaster(“local[*]”).setAppName(“HotCategoryTop10Analysis”)
val sc = new SparkContext(conf)
val actionRDD: RDD[String] = sc.textFile(“in/user_visit_action.txt”)
val actionDataRDD: RDD[UserVisitAction] = actionRDD.map(
actions => {
val datas = actions.split("")
UserVisitAction(
datas(0),
datas(1).toLong,
datas(2),
datas(3).toLong,
datas(4),
datas(5),
datas(6).toLong,
datas(7).toLong,
datas(8),
datas(9),
datas(10),
datas(11),
datas(12).toLong
)
}
)
// TODO 计算分母
val ids = List(1L,2L,3L,4L,5L,6L,7L)
val okflowIds = ids.zip(ids.tail)
val pageidToCountMap: Map[Long, Long] = actionDataRDD.filter(
action => {
ids.init.contains(action.page_id)
}
)
.map(
action => {
(action.page_id, 1L)
}
).reduceByKey(
+ ).collect().toMap
//计算分子 根据session分组
val sessionRDD: RDD[(String, Iterable[UserVisitAction])] = actionDataRDD.groupBy(
.session_id)
//分组后 根据访问时间进行排序
val mvRDD = sessionRDD.mapValues(
iter => {
//对时间排序
val sortList: List[UserVisitAction] = iter.toList.sortBy(.action_time)
val flowIds: List[Long] = sortList.map(
.page_id)
val pageflowIds: List[(Long, Long)] = flowIds.zip(flowIds.tail)
pageflowIds.filter(
t=>{
okflowIds.contains(t)
}
).map(
t=>{
(t,1)
}
)
}
)
//((1,2)1),
val flatRDD: RDD[((Long, Long), Int)] = mvRDD.map(.2).flatMap(list=>list)
val dataRDD: RDD[((Long, Long), Int)] = flatRDD.reduceByKey(
+
)
//计算单挑转换率 分子除以分母
dataRDD.foreach{
case ((pageid1,pageid2),sum)=>{
val lon: Long = pageidToCountMap.getOrElse(pageid1,0L)
println(s"页面 p a g e i d 1 跳 转 到 页 面 {pageid1}跳转到页面 pageid1{pageid2}的单挑转换率为"+(sum.toDouble/lon))
}
}
//[1,2,3,4,5,6]
//[1,2],[2,3],[3,4],[4,5]
//[1-2,2-3,3-4,4-5] Sliding滑窗
//[1,2,3,4,5]
//[2,3,4,5,6] 上一个集合的尾部
//zip:拉链
sc.stop()
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值