数据说明
//用户访问动作表
case class UserVisitAction(
date: String,//用户点击行为的日期
user_id: Long,//用户的ID
session_id: String,//Session的ID
page_id: Long,//某个页面的ID
action_time: String,//动作的时间点
search_keyword: String,//用户搜索的关键词
click_category_id: Long,//某一个商品品类的ID
click_product_id: Long,//某一个商品的ID
order_category_ids: String,//一次订单中所有品类的ID集合
order_product_ids: String,//一次订单中所有商品的ID集合
pay_category_ids: String,//一次支付中所有品类的ID集合
pay_product_ids: String,//一次支付中所有商品的ID集合
city_id: Long
)//城市 id
需求1:Top10热门品类
1.1 需求说明
品类是指产品的分类,大型电商网站品类分多级,咱们的项目中品类只有一级,不同的公司可能对热门的定义不一样。我们按照每个品类的点击、下单、支付的量来统计热门品类。
鞋 点击数 下单数 支付数
衣服 点击数 下单数 支付数
电脑 点击数 下单数 支付数
例如,综合排名 = 点击数20%+下单数30%+支付数*50%
本项目需求优化为:
先按照点击数排名,靠前的就排名高;如果点击数相同,再比较下单数;下单数再相同,就比较支付数。
bean
package object bean {
//用户访问动作表
case class UserVisitAction(
date: String,//用户点击行为的日期
user_id: String,//用户的ID
session_id: String,//Session的ID
page_id: String,//某个页面的ID
action_time: String,//动作的时间点
search_keyword: String,//用户搜索的关键词
click_category_id: String,//某一个商品品类的ID
click_product_id: String,//某一个商品的ID
order_category_ids: String,//一次订单中所有品类的ID集合
order_product_ids: String,//一次订单中所有商品的ID集合
pay_category_ids: String,//一次支付中所有品类的ID集合
pay_product_ids: String,//一次支付中所有商品的ID集合
city_id: String //城市 id
)
}
HotCategoryTOP10ApplicationReview
import com.atguigu.core.hotcategorytop10review.controller.HotCategoryTop10ControllerReview
import com.atguigu.summer.framework.core.TApplication
object HotCategoryTOP10ApplicationReview extends App with TApplication{
start("Spark"){
val hotCategoryTop10ControllerReview = new HotCategoryTop10ControllerReview
hotCategoryTop10ControllerReview.execute()
}
}
HotCategoryTop10ControllerReview
import com.atguigu.core.hotcategorytop10review.service.HotCategoryTop10ServiceReview
import com.atguigu.summer.framework.core.TController
class HotCategoryTop10ControllerReview extends TController{
private val hotCategoryTop10ServiceReview = new HotCategoryTop10ServiceReview
override def execute(): Unit = {
val result: Array[(String, (Int, Int, Int))] = hotCategoryTop10ServiceReview.analysis()
result.foreach(println)
}
}
HotCategoryTop10DAOReview
import com.atguigu.core.hotcategorytop10review.bean.UserVisitAction
import com.atguigu.summer.framework.core.TDAO
import org.apache.spark.rdd.RDD
/**
* @Description 资源连接层
* *
* @author lianzhipeng
* @create 2020-06-11 0:38:25
*/
class HotCategoryTop10DAOReview extends TDAO {
def getUserVisitAction() = {
// 读取路径下的数据
val fileRDD: RDD[String] = readFile("input/user_visit_action.txt")
// 将数据封装对象
fileRDD.map(
data => {
val datasArray: Array[String] = data.split("_")
UserVisitAction(
datasArray(0),
datasArray(1),
datasArray(2),
datasArray(3),
datasArray(4),
datasArray(5),
datasArray(6),
datasArray(7),
datasArray(8),
datasArray(9),
datasArray(10),
datasArray(11),
datasArray(12)
)
}
)
}
}
HotCategoryTop10ServiceReview
import java.io
import com.atguigu.core.hotcategorytop10review.bean
import com.atguigu.core.hotcategorytop10review.dao.HotCategoryTop10DAOReview
import com.atguigu.summer.framework.core.TService
import org.apache.spark.rdd.RDD
/**
* @Description 计算逻辑层
**
* @author lianzhipeng
* @create 2020-06-11 0:37:41
*/
class HotCategoryTop10ServiceReview extends TService{
private val hotCategoryTop10DAOReview = new HotCategoryTop10DAOReview
override def analysis() = {
// 获取数据,数据已经被封装成一个一个的对象
val UserRDD: RDD[bean.UserVisitAction] = hotCategoryTop10DAOReview.getUserVisitAction()
//1. 数据进行切分,根据每条数据是哪种行为,将数据转换为:
// (品类,(1,0,0)) : 点击行为
// (品类,(0,1,0)) : 下单行为
// (品类,(0,0,1)) : 支付行为
val cagegoryToOneRDD: RDD[(String, (Int, Int, Int))] = UserRDD.flatMap(UserBean => {
if (UserBean.click_category_id != "-1") {
List((UserBean.click_category_id, (1, 0, 0)))
} else if (UserBean.order_category_ids != "null") {
val ids: Array[String] = UserBean.order_category_ids.split(",")
ids.map(id => (id, (0, 1, 0)))
} else if (UserBean.pay_category_ids != "null") {
val ids: Array[String] = UserBean.pay_category_ids.split(",")
ids.map(id => (id, (0, 0, 1)))
} else {
Nil
}
})
//2. 按照品类进行分组聚合:
// 品类,(clickCount,orderCont,payCount)
val categorySumRDD: RDD[(String, (Int, Int, Int))] = cagegoryToOneRDD.reduceByKey {
case ((click, order, pay), (click1, order1, pay1)) => {
(click + click1, order + order1, pay + pay1)
}
}
//3. 排序取前10
val result: Array[(String, (Int, Int, Int))] = categorySumRDD.sortBy(_._2,false).take(10)
result
}
override def analysis(data: Any): Any = ???
}
1.2 实现方案一
分别统计每个品类点击的次数,下单的次数和支付的次数:
(品类,点击总数)(品类,下单总数)(品类,支付总数)