李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
大数据
正文
SparkSQL案例实操(一)
Leefs
2021-11-11 PM
1995℃
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://www.lilinchao.com/archives/1620.html
上一篇
SparkCore之广播变量
下一篇
SparkSQL案例实操(二)
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
8
标签云
容器深入研究
pytorch
SpringCloudAlibaba
Flume
Shiro
Spring
BurpSuite
Spark SQL
Spark
Ubuntu
Hbase
Flink
算法
微服务
并发编程
高并发
排序
数据结构
Java工具类
Map
锁
设计模式
Sentinel
Yarn
RSA加解密
随笔
Elasticsearch
CentOS
正则表达式
Tomcat
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭