当前位置:网站首页>spark:商品热门品类TOP10统计(案例)
spark:商品热门品类TOP10统计(案例)
2022-08-02 08:28:00 【一个人的牛牛】
目录
介绍
品类是指产品的分类,大型电商网站品类分多级,一般为三级分类,此次项目中品类只有一级。
不同的公司对热门的定义不一样。此次按照每个品类的 点击---->下单---->支付 的量来统计热门品类。先按照点击数排名,数量决定排名;点击数相同,比较下单数;下单数相同,比较支付数。
数据准备
点击链接下载数据(免费下载)
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() } }
本文为学习笔记记录!
边栏推荐
- pnpm:简介
- OneinStack多版本PHP共存
- R语言plotly可视化:plotly可视化回归模型实际值和回归预测值的散点图分析回归模型的预测效能、一个好的模型大部分的散点在对角线附近(predicted vs actual)
- Button to control the running water light (timer)
- A little bit of knowledge - why do not usually cook with copper pots
- MySQL 中 count() 和 count(1) 有什么区别?哪个性能最好?
- 【特别提醒】订阅此专栏的用户请先阅读本文再决定是否需要购买此专栏
- etcd实现大规模服务治理应用实战
- Redisson distributed lock source code analysis for high-level use of redis
- Biotin - LC - Hydrazide | CAS: 109276-34-8 | Biotin - LC - Hydrazide
猜你喜欢
52. [Bool type input any non-0 value is not 1 version reason]
shell脚本
深度学习汇报(4)
Redisson的看门狗机制
OneinStack多版本PHP共存
【电子电路】长按键拉低电平,适用在有休眠机制的MCU但是没有看门狗,一个按键多个功能场景下使用
MySQL 中 count() 和 count(1) 有什么区别?哪个性能最好?
openpyxl 单元格合并
Biotinyl Cystamine | CAS: 128915-82-2 | biotin cysteamine
Biotin hydrazide HCl|CAS:66640-86-6|Biotin-hydrazide hydrochloride
随机推荐
OneNote Tutorial, How to Create More Spaces in OneNote?
Jenkins--基础--07--Blue Ocean
LeetCode_2358_分组的最大数量
小康股份更名赛力斯,如何走出一条高端产品的“丝绸之路”?
Installation and use of pnpm
JSP页面中page指令有哪些属性及方法可使用呢?
文章解读 -- FlowNet3D:Learning Scene Flow in 3D Point Clouds
如何建立私域流量?私域流量对企业有什么好处?
C语言基础_共用体
What is NoSQL?Databases for the cloud-scale future
自定义卡包效果实现
了解下C# 多线程
三维体尺测量
day——05 迭代器,生成器
OneinStack多版本PHP共存
Detailed explanation of calculation commands in shell (expr, (()), $[], let, bc )
tf.where使用
52. [Bool type input any non-0 value is not 1 version reason]
Axial Turbine Privacy Policy
Docker内MySQL主从复制学习,以及遇到的一些问题