2024.1.30 Spark SQL的高级用法

目录

1、如何快速生成多行的序列

2、如何快速生成表数据

3.开窗函数

排序函数

平分函数 

聚合函数

 向上向下窗口函数


1、如何快速生成多行的序列

-- 需求: 请生成一列数据, 内容为 1 , 2 , 3 , 4 ,5   仅使用select语句
select explode(split('1,2,3,4,5',',')) as num;-- 需求: 请生成一列数据, 内容 1~100  python 中有一个函数  range(1,100)
-- SQL函数: https://spark.apache.org/docs/3.1.2/api/sql/index.html
-- sequence(start, stop, step)  :  参数1: 起始值  参数2  结束值  参数3  步长(默认为1)   包头包尾
select explode(sequence(1,100)) as  num;

2、如何快速生成表数据

快速生成列 

--生成一列 1,2,3,4,5的数据
select explode(split('1,2,3,4,5', ',')) as num;
--生成一列数据内容1-100
select sequence(1,100,1);
-- 索引从0开始
select explode(sequence(0,100,20))as num;

快速生成内容 

-- 生成一个两行两列的数据,第一行放置男 m,第二行放置女 f
select stack(2,'男','M','女','F')as (sex1,sex2);

select  stack(2,'M','F')as sex;

永久视图 

-- 创建永久视图
create or replace view t3 asselect stack(2,'M','F')as sex;
select * from t3;

临时视图 

-- 创建临时视图
create or replace temporary view t4 asselect stack(2,'男','女')as sex;
select * from t4;

复制表 

-- 创建复制表
use test_sql;
create table t5 asselect stack(2,'M','F')as sex;
select * from t5;

 缓存相关内容


-- 缓存表
cache table t6 asselect  stack(2,'M','F')as sex;--清空一个表的缓存数据
UNCACHE TABLE t6;--清空所有的缓存
clear chche;

3.开窗函数

创建数据

-- 初始化一些数据
create or replace temporary view t1(cookie, dateStr,pv) asvalues ('cookie1','2022-10-05',80),('cookie1','2022-10-06',75),('cookie1','2022-10-07',75),('cookie1','2022-10-08',79),('cookie1','2022-10-09',85),('cookie1','2022-10-10',71),('cookie2','2022-10-05',80),('cookie2','2022-10-06',74),('cookie2','2022-10-07',79),('cookie2','2022-10-08',92),('cookie2','2022-10-09',95);select * from t1;

 cookie1,2022-10-05,80
cookie1,2022-10-06,75
cookie1,2022-10-07,75
cookie1,2022-10-08,79
cookie1,2022-10-09,85
cookie1,2022-10-10,71
cookie2,2022-10-05,80
cookie2,2022-10-06,74
cookie2,2022-10-07,79
cookie2,2022-10-08,92
cookie2,2022-10-09,95

排序函数

--排序函数 1234,1223,1224
select *,row_number() over (partition by cookie order by pv desc )as rn
from t1;
select *,dense_rank()  over (partition by cookie order by pv desc )as rn
from t1;
select *,rank() over (partition by cookie order by pv desc )as rn
from t1;
 

平分函数 

ntile(N): 在进行打标记的时候, 会根据N将窗口内的数据划分为等份的N份, 每一份打上相同的标记

select *,ntile(4) over (partition by cookie order by pv desc) as rn4
from t1;

cookie1,2022-10-09,85,1
cookie1,2022-10-05,80,1
cookie1,2022-10-08,79,2
cookie1,2022-10-06,75,2
cookie1,2022-10-07,75,3
cookie1,2022-10-10,71,4 

聚合函数

   第二类: 和聚合函数组合使用

    可以通过窗口实现级联求各种值或者累计求各种值的操作:
        当后续遇到需要在计算的时候, 将当前行或者之前或者之后的相关某几行进行计算的时候, 可以使用这个方案

    说明:
        1- 如果排序字段存在重复值, 默认会将重复的范围内全部数据级联计算在一起
        2- 如果没有排序字段, 整个窗口会全部打开, 不管执行到哪一行, 都是针对整个窗口进行级联计算
        3- 可以通过rows between方式来锁定窗口的范围:
            N preceding : 表示往前的N行, N的取值可以是具体的数据, 也可以是关键词(unbounded(边界))
            N following : 表示往后的N行, N的取值可以是具体的数据, 也可以是关键词(unbounded(边界))
            current row : 当前行
*/

select *,sum(pv)over (partition by cookie order by pv desc )as rn1
from t1;

cookie1,2022-10-09,85,85
cookie1,2022-10-05,80,165
cookie1,2022-10-08,79,244
cookie1,2022-10-06,75,394
cookie1,2022-10-07,75,394
cookie1,2022-10-10,71,465
 

 

--从前面计算到当前行
select *,sum(pv)over (partition by cookie
    order by pv rows between unbounded preceding and current row )as rn2
from t1;

cookie1,2022-10-10,71,71
cookie1,2022-10-06,75,146
cookie1,2022-10-07,75,221
cookie1,2022-10-08,79,300
cookie1,2022-10-05,80,380
cookie1,2022-10-09,85,465
 

 

--将当前行,前一行,后一行进行计算
select *,sum(pv) over(partition by cookie
    order by pv rows between 1 preceding and 1 following ) as rn3
from t1;

cookie1,2022-10-10,71,146
cookie1,2022-10-06,75,221
cookie1,2022-10-07,75,229
cookie1,2022-10-08,79,234
cookie1,2022-10-05,80,244
cookie1,2022-10-09,85,165
 

 

-- 从当前行计算到最后
select *,sum(pv) over (partition by cookie
    order by pv rows between current row and unbounded following)as rn4
from t1;

cookie1,2022-10-10,71,465
cookie1,2022-10-06,75,394
cookie1,2022-10-07,75,319
cookie1,2022-10-08,79,244
cookie1,2022-10-05,80,165
cookie1,2022-10-09,85,85
 

 

-- 计算窗口内所有的,rn列的每一个数字都是pv窗口内求和的总数
select *,sum(pv) over (partition by cookie order by pv
    rows between unbounded preceding and unbounded following)as rn6
from t1;

cookie1,2022-10-10,71,465
cookie1,2022-10-06,75,465
cookie1,2022-10-07,75,465
cookie1,2022-10-08,79,465
cookie1,2022-10-05,80,465
cookie1,2022-10-09,85,465
 

 向上向下窗口函数

   lag(字段, 往前第N行, 默认值): 可以实现将对应的字段的前N行的值和当前行放置到同一行中, 如果没有, 设置为默认值
    lead(字段, 往后第N行, 默认值): 可以实现将对应的字段的后N行的值和当前行放置到同一行中, 如果没有, 设置为默认值

    以上的两个分析函数, 必须带上排序操作

    first_value(字段) : 用于将字段的第一行的值 和 每一行放置在一起
    last_value(字段)  : 用于将字段的最后一行的值 和 每一行放置在一起
        注意:
            如果有排序字段, 会形成当前行和当前行的值放置在一起
            解决方案:
                方案一: 去除排序字段, 但是弊端没有排序操作, 可能最后一行不是你所想要的最后一行的值
                方案二: 保留排序操作, 通过 rows between 强制打开窗口最大范围
                    rows between unbounded preceding and unbounded following

    应用场景: 当我们需要将当前行和之前或者之后的某一行进行计算操作的时候,  需要通过这类分析函数, 将其放置到同一行进行处理

    比如说: 转换率计算
*/

-- lag向上取第2个数作为rn列的值
select *,lag(pv,2,0)over (partition by cookie order by dateStr)as rn1
from t1;

cookie1,2022-10-05,80,0
cookie1,2022-10-06,75,0
cookie1,2022-10-07,75,80
cookie1,2022-10-08,79,75
cookie1,2022-10-09,85,75
cookie1,2022-10-10,71,79
 

 

-- lead向下取第2个值作为rn列的值
select *,lead(pv,2,0) over (partition by cookie order by dateStr) as rn2
from t1;

cookie1,2022-10-05,80,75
cookie1,2022-10-06,75,79
cookie1,2022-10-07,75,85
cookie1,2022-10-08,79,71
cookie1,2022-10-09,85,0
cookie1,2022-10-10,71,0
 

 

--first value取窗口内最开头的值作为rn列的值
select *,first_value(pv) over (partition by cookie order by dateStr desc )as rn3
from t1;

cookie1,2022-10-10,71,71
cookie1,2022-10-09,85,71
cookie1,2022-10-08,79,71
cookie1,2022-10-07,75,71
cookie1,2022-10-06,75,71
cookie1,2022-10-05,80,71
 

 

--last value取最后的值作为rn列的值,如果有排序字段,就会形成rn列的值和当前行一样,等于没用
select *,last_value(pv) over (partition by cookie order by dateStr) as rn4
from t1;
-- 解决方法,要么把排序的字段去掉,要么设置窗口变成最大
-- last value ,留下排序的同时,设置窗口最大数,这样就能取到最后的数作为rn列的值
-- unbounded preceding and unbounded following 无界前和无界后

select *,last_value(pv) over(partition by cookie order by dateStr
    rows between unbounded preceding and unbounded following
    ) as rn5
from t1;

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/666399.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我用全志V851s做了一个魔法棒,使用Keras训练手势识别模型控制一切电子设备

这是一个可以直接启动原神的魔法棒~ 原神,启动! 这是一个万全的解决方案!只需要花80元再动动手,就可以将哈利波特的魔杖与人工智能结合到一起!它就是用全志V851s做的赛博魔杖! 这个魔法手杖有啥亮点 手势…

Linux mount命令教程:如何挂载文件系统(附案例详解和注意事项)

Linux mount命令介绍 mount命令在Linux中用于挂载Linux系统外的其它文件系统,每个设备在使用前都必须先挂载。此命令通常用于挂载文件系统。 Linux mount命令适用的Linux版本 mount命令在所有的Linux发行版中都是可用的,包括Debian、Ubuntu、Alpine、…

oracle 热备份和冷备份的优缺点

Oracle的热备份和冷备份是两种不同的备份策略,各有其优缺点。 热备份的优点包括: 可快速备份数据,备份时间短。备份时数据库仍可使用。可达到秒级恢复,即恢复到某一时间点上。可对几乎所有数据库实体进行恢复。恢复快速&#xf…

Go协程揭秘:轻量、并发与性能的完美结合

目录 1. Go协程简介什么是Go协程?Go协程与线程的比较Go协程的核心优势 2. Go协程的基本使用创建并启动Go协程使用匿名函数创建Go协程Go协程与主函数 3. Go协程的同步机制1. 通道 (Channels)2. sync.WaitGroup3. 互斥锁 (sync.Mutex) 4. Go协程的高级用法1. 选择器 (…

每日一题——LeetCode1394.找出数组中的幸运数

方法一 桶数组计数法 又要保存整数的数值和他出现的频次,那么碰到一个整数num就让res[num],那么循环res数组,如果res[i]0则代表i没有在arr中出现过,res[i]n则代表i在arr中出现n次 因为题目要求只返回最大的幸运数,所…

计算机软件能力认证考试CCF-202312-1 仓库规划

#自己跑的测试没问题&#xff0c;不知道为啥就是不能满分 原理比较绕&#xff0c;就是让数组中一行不断地与其他行进行比较&#xff0c;最终得到各自的索引 #include <iostream> using namespace std; int main() {int n;int m;cin>>n>>m; int array[n][m];…

【C/C++ 08】简单计算器

一、题目 输入算术表达式&#xff0c;可包含空格&#xff0c;检查算术表达式的合法性&#xff0c;若算术表达式不合法&#xff0c;打印错误类型&#xff0c;若合法&#xff0c;则进行运算&#xff0c;打印计算结果。 二、算法 1. 将输入的算术表达式字符串去除空格。 2. 检查…

vue在main.js中引入三方插件不生效的原因

有的时候需要比较复杂的功能,但是自己实现比较复杂的话,可以引入第三方插件.如果这个第三方插件需要全局都使用的话,可以在main.js中进行引入. 比如router elementplus之类的. import { createApp } from vue import ElementPlus from element-plus import element-plus/dist/…

电源模块欠压保护点测试方法分享 纳米软件

电源欠压保护原理 欠压保护是指当电源电压低于一定值时&#xff0c;电源的保护功能会及时断开电路&#xff0c;避免设备受到损坏。电源欠压保护一般是通过一个或多个传感器来检测电压&#xff0c;当电压低于设定值时就会触发电源的保护功能&#xff0c;断开电路&#xff0c;保护…

猫用空气净化器真的能除菌吗?除毛可以用宠物空气净化器吗?

猫咪给我们带来了无尽的欢乐&#xff0c;但它们换毛时家里到处都是猫毛。我们会在地板、沙发上发现一大堆&#xff0c;甚至衣服也难逃其影响。这些浮毛中可能携带着微生物和尘螨等。对于免疫力较低的老年人、孩子和孕妇来说&#xff0c;他们更容易感染这些微生物。而对于鼻炎患…

[Tomcat问题]--使用Tomcat 10.x部署项目时,出现实例化Servlet类[xxx]异常

[Tomcat问题]–使用Tomcat 10.x部署项目时&#xff0c;出现实例化Servlet类[xxx]异常 本片博文在知乎同步更新 环境 OS: Windows 11 23H2Java Version: java 21.0.1 2023-10-17 LTSIDE: IntelliJ IDEA 2023.3.3Maven: Apache Maven 3.9.6Tomcat: Tomcat 10.1.18 ReleasedSer…

windows下docker的使用

目录 1&#xff1a;docker是什么&#xff0c;能干什么&#xff1f; 2&#xff1a;docker下初始化一个容器 1&#xff1a;工具支持 2&#xff1a;运行装载docker镜像 a&#xff1a;在docker toolbox底下有个start.sh&#xff0c;我们进去里面修改里面路径配置&#xff1a; …

vulhub中Adminer远程文件读取漏洞复现(CVE-2021-43008)

Adminer是一个PHP编写的开源数据库管理工具&#xff0c;支持MySQL、MariaDB、PostgreSQL、SQLite、MS SQL、Oracle、Elasticsearch、MongoDB等数据库。 在其版本1.12.0到4.6.2之间存在一处因为MySQL LOAD DATA LOCAL导致的文件读取漏洞。 参考链接&#xff1a; https://gith…

JAVA Studynote(7-8)

JAVA Studynote(7-8) 1.DOS系统 ​ *接受指令 *解析指令 *执行指令 2.相对路径和绝对路径 *相对路径 ​ *从当前目录开始定位&#xff0c;形成的一个路径 *绝对路径 ​ *从顶级目录d&#xff0c;开始定位&#xff0c;形成的路径 ​ *示例&#xff1a; 3.常用DOS指令 …

arch linux python venv

0x00 前言 直接使用全局pip安装库的&#xff0c;会有如下error error: externally-managed-environment This environment is externally managed ╰─> To install Python packages system-wide, try pacman -Spython-xyz, where xyz is the package you are trying toin…

12种算法优化CNN-BiLSTM-Attention多特征输入单步预测,机器学习预测全家桶,持续更新,MATLAB代码...

截止到本期&#xff0c;一共发了12篇关于机器学习预测全家桶MATLAB代码的文章。参考文章如下&#xff1a; 1.五花八门的机器学习预测&#xff1f;一篇搞定不行吗&#xff1f; 2.机器学习预测全家桶&#xff0c;多步预测之BiGRU、BiLSTM、GRU、LSTM&#xff0c;LSSVM、TCN、CNN&…

【lesson8】高并发内存池Central Cache层释放内存的实现

文章目录 Central Cache层释放内存的流程Central Cache层释放内存的实现 Central Cache层释放内存的流程 当thread_cache过长或者线程销毁&#xff0c;则会将内存释放回central cache中的&#xff0c;释放回来时–use_count。当use_count减到0时则表示所有对象都回到了span&am…

备战蓝桥杯---数据结构与STL应用(进阶4)

今天主要围绕并查集的一些今典题目展开&#xff1a; 在这里&#xff0c;我们把逻辑真的组合&#xff0c;用并查集即可。一开始&#xff0c;我觉得把a,b,c等价&#xff0c;把第一个赋a,接下来推即可&#xff0c;但这样在判断矛盾时还需要选择合适的点find&#xff0c;于是我们把…

【使用 Python 进行 NLP】 第 2 部分 NLTK

一、说明 Python 有一些非常强大的 NLP 库&#xff0c;NLTK — 自然语言工具包 — NLTK 是一个强大的开源库&#xff0c;用于 NLP 的研究和开发。它内置了 50 多个文本语料库和词汇资源。它支持文本标记化、词性标记、词干提取、词形还原、命名实体提取、分割、分类、语义推理。…

Ubuntu-Docker下的MySQL服务搭建与外联(持续更新)

部署背景:手边频繁变换的linux操作环境导致需要不停的配置基本的MySQL等开发/技术探索环境,docker自身强大的可移植性很好的解决了这个问题! Deployment background: The frequently changing linux operating environment at hand leads to the need to constantly config…