zoukankan      html  css  js  c++  java
  • sparkSql实战案例

    需求:

    统计每个用户的累计访问次数。

    要求使用SQL统计出每个用户的累积访问次数,如下表所示:

    用户id 月份 小计 累积
    u01 2021-01 11 11
    u01 2021-02 12 23
    u02 2021-01 12 12
    u03 2021-01 8 8
    u04 2021-01 3 3

    数据集:
    useraccesscount

    userid,visitdate,visitcount
    u01,2021/1/21,5
    u02,2021/1/23,6
    u03,2021/1/22,8
    u04,2021/1/20,3
    u01,2021/1/23,6
    u01,2021/2/21,8
    u02,2021/1/23,6
    u01,2021/2/22,4
    

    思路:
    1.修改数据格式。从结果反推,需要查询实现按照 年-月 分组的数据,所以我们这一步先对原数据进行一个处理。
    2.计算每人单月访问量,获取每个用户,每个月的访问量。
    3.按月累计计算访问量。用一个sum开窗函数,对userid进行分组,date时间进行排序即可。

    代码:

    package shangxuetang
    
    import org.apache.spark.sql.SparkSession
    //统计每个用户的累计访问次数
    object UserAccessCount {
      def main(args: Array[String]): Unit = {
        val spark = SparkSession.builder().appName("").master("local[*]").getOrCreate()
        val df = spark.read.option("header",true).csv("D:\IDEAProject\sparksql\src\main\resources\useraccesscount")
        //df.show()
        df.createTempView("temp1")
        //1.修改数据格式
        //从结果反推,需要查询实现按照 年-月 分组的数据,所以我们这一步先对原数据进行一个处理。
        spark
          .sql(
            """
              |select
              |     userid,
              |     date_format(regexp_replace(visitdate,'/','-'),'yyyy-MM') date,
              |     visitcount
              |from
              |     temp1
              |""".stripMargin).createTempView("temp2")
    
        //2.计算每人单月访问量,获取每个用户,每个月的访问量。
          spark
            .sql(
              """
                |select userid,date,sum(visitcount) as usercount
                |
                |from temp2
                |group by userid,date
                |order by userid,date
                |""".stripMargin).createTempView("temp3")
    
        //3.按月累计计算访问量。用一个sum开窗函数,对userid进行分组,date时间进行排序即可。
        spark
          .sql(
            """
              |select userid,date,usercount,
              |sum(usercount) over (partition by userid order by date asc) as totalcount
              |from temp3
              |order by userid
              |""".stripMargin).show()
    
      spark.stop()
    
      }
    }
    

    结果:

    //第一步结果
    +------+-------+----------+
    |userid|   date|visitcount|
    +------+-------+----------+
    |   u01|2021-01|         5|
    |   u02|2021-01|         6|
    |   u03|2021-01|         8|
    |   u04|2021-01|         3|
    |   u01|2021-01|         6|
    |   u01|2021-02|         8|
    |   u02|2021-01|         6|
    |   u01|2021-02|         4|
    +------+-------+----------+
    
    //第二步结果
    +------+-------+---------+
    |userid|   date|usercount|
    +------+-------+---------+
    |   u01|2021-01|     11.0|
    |   u01|2021-02|     12.0|
    |   u02|2021-01|     12.0|
    |   u03|2021-01|      8.0|
    |   u04|2021-01|      3.0|
    +------+-------+---------+
    
    //最终结果
    +------+-------+---------+----------+
    |userid|   date|usercount|totalcount|
    +------+-------+---------+----------+
    |   u01|2021-01|     11.0|      11.0|
    |   u01|2021-02|     12.0|      23.0|
    |   u02|2021-01|     12.0|      12.0|
    |   u03|2021-01|      8.0|       8.0|
    |   u04|2021-01|      3.0|       3.0|
    +------+-------+---------+----------+
  • 相关阅读:
    函数式编程(二):curry
    函数式编程(一):纯函数
    用 gulp 建一个服务器
    深度学习-Tensorflow2.2-预训练网络{7}-迁移学习基础针对小数据集-19
    深度学习-Tensorflow2.2-自定义训练综合实例与图片增强{6}-猫狗数据集实例-18
    深度学习-Tensorflow2.2-Tensorboard可视化{5}-可视化基础-17
    深度学习-Tensorflow2.2-Eager模式与自定义训练{4}-微分运算训练练习-16
    深度学习-Tensorflow2.2-卷积神经网络{3}-电影评论数据分类/猫狗数据集实例-15
    深度学习-Tensorflow2.2-批标准化简介-14
    深度学习-Tensorflow2.2-卷积神经网络{3}-卫星图像识别卷积综合实例(二分类)-13
  • 原文地址:https://www.cnblogs.com/wanpi/p/14977549.html
Copyright © 2011-2022 走看看