Spark入门项目Top10

数据说明

在这里插入图片描述

//用户访问动作表
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 实现方案一

分别统计每个品类点击的次数,下单的次数和支付的次数:

(品类,点击总数)(品类,下单总数)(品类,支付总数)

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oifengo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值