李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
大数据
正文
SparkSQL案例实操(一)
Leefs
2021-11-11 PM
1720℃
0条
[TOC] ### 一、需求 > 统计每个用户的累计访问次数 要求使用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 | *说明:累计访问次数按照月份进行排序,根据每个用户逐月进行累加* ### 二、数据准备 + **`user_access_count.csv`文件** ``` 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 ``` **说明** + **userid:**用户ID + **visitdate:**访问时间(年/月/日) + **visitcount:**每天访问总数 ### 三、实现 #### 3.1 步骤 ``` 1.修改数据格式,将时间按照月份进行转换(根据需求进行格式化处理) 2.根据每个用户每个月的访问量进行聚合统计 3.按月累计计算访问量 - 用一个sum开窗函数,对userid进行分组 - 再通过date时间进行排序即可 ``` #### 3.2 代码 ```scala import org.apache.spark.sql.{DataFrame, SparkSession} /** * @author lilinchao * @date 2021/11/11 * @description 统计每个用户的累计访问次数 **/ object UserAccessCount { def main(args: Array[String]): Unit = { val spark = SparkSession.builder().appName("UserAccessCount").master("local[*]").getOrCreate() //读取CSV数据 val df: DataFrame = spark.read .option("header", true) .csv("data_sql/user_access_count.csv") // df.show() //创建临时视图 df.createTempView("UserAccess") //1.修改数据格式,将时间按照月份进行转换(根据需求进行格式化处理) spark.sql( """ |select | userid, | date_format(regexp_replace(visitdate,'/','-'),'yyyy-MM') date, | visitcount |from | UserAccess """.stripMargin) // .show() .createTempView("UserAccessDataChange") //2.根据每个用户每个月的访问量进行聚合统计 spark.sql( """ |select | userid, | date, | sum(visitcount) as usercount |from UserAccessDataChange |group by userid,date |order by userid,date """.stripMargin) // .show() .createTempView("UserAccessGroup") //3.按月累计计算访问量 //用一个sum开窗函数,对userid进行分组,再通过date时间进行排序即可 spark.sql( """ |select | userid, | date, | usercount, | sum(usercount) over (partition by userid order by date asc) as totalcount |from UserAccessGroup |order by userid,date """.stripMargin).show() //关闭连接 spark.stop() } } ``` **运行结果** ``` +------+-------+---------+----------+ |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*
标签:
Spark
,
Spark SQL
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/1620.html
上一篇
SparkCore之广播变量
下一篇
SparkSQL案例实操(二)
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
nginx
Filter
Hive
链表
正则表达式
设计模式
Hbase
MySQL
机器学习
ClickHouse
Tomcat
散列
Spark
Livy
线程池
人工智能
RSA加解密
MyBatis
Spark SQL
FileBeat
gorm
NIO
Flink
BurpSuite
Java编程思想
Golang基础
FastDFS
Ubuntu
Flume
并发编程
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭