• 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|
    +------+-------+---------+----------+
  • 相关阅读:
    Make something people want
    POJ 3662 Telephone Lines (二分+Dijkstra)
    POJ 2010 Moo University
    HDU 6627 2017ACM/ICPC亚洲区域赛沈阳站 Rabbits
    HDU 6625 2017ACM/ICPC亚洲区域赛沈阳站 Little Boxes(高精度整数加法)
    Codeforces 877D Olya and Energy Drinks(BFS+剪枝)
    CodeForces 876B Divisiblity of Differences (数学水题)
    POJ 2139 Six Degrees of Cowvin Bacon (Floyd最短路)
    UESTC 1057 秋实大哥与花 (线段树)
    Linux安装Oh-my-zsh
  • 原文地址:https://www.cnblogs.com/wanpi/p/14977549.html
Copyright © 2020-2023  润新知