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