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|
+------+-------+---------+----------+
原文地址:https://www.cnblogs.com/wanpi/p/14977549.html