介绍
品类是指产品的分类,大型电商网站品类分多级,一般为三级分类,此次项目中品类只有一级。
不同的公司对热门的定义不一样。此次按照每个品类的 点击---->下单---->支付 的量来统计热门品类。先按照点击数排名,数量决定排名;点击数相同,比较下单数;下单数相同,比较支付数。
数据准备
点击链接下载数据(免费下载)
14万条用户行为数据,搜索、点击、下单、支付-spark文档类资源-CSDN下载
数据说明:
时间_用户ID_sessionID_页面ID_动作时间_搜索_点击(品类ID、产品ID)_下单(品类ID、产品ID)_支付(品类ID、产品ID)_城市ID
代码实现
分别统计每个品类点击的次数,下单的次数和支付的次数:
(品类,点击总数)(品类,下单总数)(品类,支付总数)
import org.apache.spark.{SparkConf, SparkContext}
object TopOne {
def main(args: Array[String]): Unit = {
//TODO 创建环境
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("TOP")
val sc = new SparkContext(sparkConf)
//TODO TOP热门商品
//读取日志文件
val rdd = sc.textFile("datas/action.txt")
rdd.cache()
//统计品类点击数量
//数据清洗
val clickRDD = rdd.filter(
action => {
val datas = action.split("_")
datas(6) != "-1"
}
)
//提取点击品类和数量并统计数量
val clickCountRDD = clickRDD.map(
action => {
val datas = action.split("_")
//(品类,数量)
(datas(6),1)
}
).reduceByKey(_+_)
// println(">>>>>>>>>")
// clickCountRDD.collect().foreach(println)
//统计品类下单数量
//数据清洗
val orderRDD = rdd.filter(
action => {
val datas = action.split("_")
datas(8) != "null"
}
)
//提取下单品类和数量并统计数量
val ordercountRDD = orderRDD.flatMap(
action => {
val datas = action.split("_")
val cid = datas(8)
//(品类,数量)
val cids = cid.split(",")
cids.map(id => (id, 1))
}
).reduceByKey(_ + _)
// println(">>>>>>>>")
// ordercountRDD.collect().foreach(println)
//统计品类支付数量
//清洗数据
val payRDD = rdd.filter(
action => {
val datas = action.split("_")
datas(10) != "null"
}
)
//提取支付品类和数量并统计数量
val paycountRDD = payRDD.flatMap(
action => {
val datas = action.split("_")
val cid = datas(10)
//(品类,数量)
val cids = cid.split(",")
cids.map(id => (id, 1))
}
).reduceByKey(_ + _)
// println(">>>>>>>>>>>>")
// paycountRDD.collect().foreach(println)
//排序————排序顺序:先点击-->再下单-->后支付
val cogroupRDD = clickCountRDD.cogroup(ordercountRDD, paycountRDD)
val cogroupRDD2 = cogroupRDD.mapValues {
case (clickIter, orderIter, payIter) => {
var clickCnt = 0
val iter1 = clickIter.iterator
if (iter1.hasNext) {
clickCnt = iter1.next()
}
var orderCnt = 0
val iter2 = orderIter.iterator
if (iter2.hasNext) {
orderCnt = iter2.next()
}
var payCnt = 0
val iter3 = payIter.iterator
if (iter3.hasNext) {
payCnt = iter3.next()
}
(clickCnt, orderCnt, payCnt)
}
}
val resultRDD = cogroupRDD2.sortBy(_._2, false).take(10)
//打印
resultRDD.foreach(println)
//TODO 关闭环境
sc.stop()
}
}
本文为学习笔记记录!
版权归原作者 一个人的牛牛 所有, 如有侵权,请联系我们删除。