0904-各区域Top3商品统计
需求六: 各区域Top3商品统计
6.1 需求概述
统计各个区域中Top3的热门商品,热门商品的评判指标是商品被点击的次数,对于user_visit_action表,click_product_id表示被点击的商品。
- 用到的表
- 用户访问行为表
- 商品信息表
- 城市信息
- 结果数据
5.2 简要运行流程
5.3 具体运行流程
- 从用户行为表里拿到城市id和点击商品id, 并以城市ID为key,用于和城市信息进行join操作
- join后转化结构,指定个字段的类型
- 创建基本数据表 (city_id, city_name, area, product_id)
- GROUP BY area,product_id 获取每个区域,每个商品的点击总和,并通过自定义函数的方式将城市信息综合
- 丰富表的内容 , 加入其它信息(商品状态,区域等级.商品名称)
- 窗口函数, 获取分组Top3
- 封装case class
- 入库
5.4 代码实现
5.4.1 获取数据
// 1. 获取数据
// RDD[(cityId, pid)]
val cityId2PidRDD: RDD[(Long, Long)] = getCityAndProductInfo(sparkSession, taskParams)
// RDD[(cityId, CityAreaInfo)]
val cityId2AreaInfoRDD = getCityAreaInfo(sparkSession)
def getCityAndProductInfo(sparkSession: SparkSession, taskParams: JSONObject) = {
val startDate = ParamUtils.getParam(taskParams, Constants.PARAM_START_DATE)
val endDate = ParamUtils.getParam(taskParams, Constants.PARAM_END_DATE)
// 只获取发生过点击的action的数据
// 获取到的一条action数据就代表一个点击行为
val sql = "select city_id, click_product_id from user_visit_action where date>='" + startDate +
"' and date<='" + endDate + "' and click_product_id != -1"
import sparkSession.implicits._
val cityId2PidRDD: RDD[(Long, Long)] = sparkSession.sql(sql)
.as[CityClickProduct]
.rdd
.map {
case (cityClickProduct) =>
(cityClickProduct.city_id, cityClickProduct.click_product_id)
}
cityId2PidRDD
}
def getCityAreaInfo(sparkSession: SparkSession) = {
val cityAreaInfoArray = Array(
(0L, "北京", "华北"),
(1L, "上海", "华东"),
(2L, "南京", "华东"),
(3L, "广州", "华南"),
(4L