需求:
统计每个用户的累计访问次数。
要求使用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| +------+-------+---------+----------+