Spark pivot数据透视从句

  • 1. 概念
  • 2. 实战
    • 2.1. 新列的决定因素
    • 2.2. 新列别名
    • 2.3. column_list中指定多个字段
    • 2.4. 多个聚合函数的使用
    • 2.5. 最终出现在SQL结果中的决定因素

Spark pivot数据透视从句

1. 概念

  • 描述
    用于数据透视,根据特定的列获取聚合值,聚合值将转换为select子句中使用的多列。可以在表名或子查询后指定pivot子句
  • 使用场景
    常见的使用场景之一,对数据进行行转列操作
  • 语法格式
select *
From Table
PIVOT ( { aggregate_expression [ AS aggregate_expression_alias ] } [ , ... ]
    FOR column_list IN ( expression_list ) )

column_list:可供选择的列为From子句中的列,将使用指定列下的值用于生成新的列。
expression_list:column_list中指定列的值。可以指定别名,指定别名后,则使用别名作为新列名,否则将直接使用列值作为新字段名。

接下来通过几个例子来理解pivot的具体用法。

2. 实战

构键测试数据

CREATE TABLE pivot1 (name STRING, subject string, score INT);
INSERT overwrite table pivot1
select inline(array(
struct('张三','语文',95),
struct('张三','英语',85),
struct('张三','数学',100),
struct('李四','语文',90),
struct('李四','英语',80),
struct('李四','数学',100),
struct('王五','语文',99),
struct('王五','数学',98)
));

2.1. 新列的决定因素

select *
from pivot1 
pivot(max(score) as score1 for subject in('语文','英语','数学'));
-- 执行结果
name    语文    英语    数学
王五    99      NULL    98
李四    90      80      100
张三    95      85      100

select *
from pivot1 
pivot(max(score) as score1 for subject in('语文','英语'));
-- 执行结果
name    语文    英语
王五    99      NULL
李四    90      80
张三    95      85

select *
from pivot1 
pivot(max(score) as score1 for subject in('英语'));
-- 执行结果
name    英语
王五    NULL
李四    80
张三    85

结果中新列取决于column_list和expression_list的共同影响,在上述示例中表示将pivot1表中subject列下的值作为新的结果列,但是具体将哪些值作为新列,取决于in后面的字段值列表。

2.2. 新列别名

select name,c,e,m
from pivot1 
pivot(max(score) as score1 for subject in('语文' as c,'英语' as e,'数学' as m));
-- 执行结果
name    c       e       m
王五    99      NULL    98
李四    90      80      100
张三    95      85      100

在in中指定的别名将作为新列的名称。

2.3. column_list中指定多个字段

select *
from pivot1 
pivot(max(score) as score1 for (subject,name) in(('语文','张三'),('语文','李四'),('语文','王五')));
-- 执行结果
[语文, 张三]    [语文, 李四]    [语文, 王五]
95             90             99

当column_list中指定多个字段时,须使用括号,并且expression_list中指定的字段值也需要使用括号,二者括号中内容顺序需要保持一致。
for (subject,name) in(('语文','张三'),('语文','李四'),('语文','王五'))最终决定测试表中只有以下数据参与计算。

'张三','语文',95
'李四','语文',90
'王五','语文',99

2.4. 多个聚合函数的使用

select *
from pivot1 
pivot(max(score) as score1,avg(score) as avg for subject in('语文','英语','数学'));
-- 执行结果
name    语文_score1     语文_avg        英语_score1     英语_avg        数学_score1     数学_avg
王五     99             99.0           NULL            NULL           98             98.0
李四     90             90.0           80              80.0           100            100.0
张三     95             95.0           85              85.0           100            100.0

select *
from pivot1 
pivot(max(score) as score1,avg(score) as avg for subject in('语文','英语'));
-- 执行结果
name    语文_score1     语文_avg        英语_score1     英语_avg
王五     99             99.0           NULL            NULL
李四     90             90.0           80              80.0
张三     95             95.0           85              85.0

上述SQL1中,原始表中3个字段列,只有name列在pivot中未涉及,但是最终结果将会包含name列下的全部值。
理解聚合函数的聚合粒度是什么?
在in中指定的值将会作为聚合条件之一,同时由于name未参与pivot函数使得结果包含全部name列值,因此结合起来的聚合条件就是name+subject

这里得出部分结论

  • column_list中已指定的列将不会出现在最终结果中
  • 聚合函数中使用的列也不会出现在最终结果中
  • 只有在column_list和聚合函数中都没有使用的列,才会原模原样出现在最终结果中,并且会将这些列作为聚合条件的一部分

2.5. 最终出现在SQL结果中的决定因素

select *
from pivot1 
pivot(max(score) as score1,avg(score) as avg,count(subject) as cnt for name in('张三','李四','王五'));
-- 执行结果
张三_score1   张三_avg    张三_cnt    李四_score1    李四_avg    李四_cnt     王五_score1    王五_avg    王五_cnt
100           93.33      3          100           90.0        3           99             98.5       2


select *
from pivot1 
pivot(max(score) as score1,avg(score) as avg,count(score) as cnt for name in('张三','李四','王五'));
-- 执行结果
subject 张三_score1    张三_avg     张三_cnt   李四_score1   李四_avg    李四_cnt     王五_score1  王五_avg    王五_cnt
英语     85            85.0        1          80           80.0        1           NULL        NULL        NULL
语文     95            95.0        1          90           90.0        1           99          99.0        1
数学     100           100.0       1          100          100.0       1           98          98.0        1

上述示例1中pivot1表中所有的字段中都参与了pivot函数,或在聚合函数中或在for后,因此SQL执行结果中将不会包含测试表中的原始列,聚合条件即为name。
示例2中pivot1表中subject字段没有参与pivot函数,因此SQL执行结果中会包含subject列的全部值,然后该值会加入到聚合条件中,聚合条件为subject+name。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu终端自动补全

文章目录 前言配置安装zsh安装 oh-my-zsh安装自动补全插件zsh-autosuggestions 参考 前言 Oh My Zsh 是一个针对命令行 shell 的开源框架,主要用于增强和美化命令行环境。它建立在 Zsh(一种强大的 shell 替代品)之上,提供了丰富的…

CountDownLatch

什么是CountDownLatch: CountDownLactch是一个同步工具类,用来协调线程之间的同步,其初始值是一个计数器,为线程的数量,当计时器的值为0时,代表此时所有线程的工作全部已经完成 常用方法: 1.cou…

33 信号产生

目录 1.键盘信号 2.显示器回显过程 3.信号产生方式 4.总结 键盘信号 键盘数据是如何输入给内核的,crtlc是怎么变成信号的? 键盘被按下,肯定是os先知道,os怎么知道键盘上有数据呢? c让操作系统每隔一段时间去轮询每…

Linux中Ctrl+C和Ctrl+Z的区别_实战讲解(超详细)

1、CtrlC和CtrlZ的区别: CtrlZ:暂停进程 即挂起进程 暂停当前进程并将其放到后台。可以在后续恢复执行。 暂停的进程仍然占用系统内存 CtrlC:终止进程 终止进程后,程序代码占用的内存会释放掉 2、实战讲解 跑人工智能代码的时候…

10.Java集合汇总

文章目录 1. Java集合概述1.1 Java集合框架概述1.2 Collection接口继承树1.3 Map接口继承树 2. Collection接口2.1 Collection接口方法 3 Iterator迭代器接口3.1 Iterator接口的方法3.2 foreach循环 4 List接口4.1 List接口方法4.1 ArrayList4.2 LinkedList4.3 Vector4.4 面试题…

如何通过大带宽优化美国站群服务器的全球访问速度?

如何通过大带宽优化美国站群服务器的全球访问速度? 在当今全球化的互联网时代,快速和稳定的网站访问对于企业至关重要。美国站群服务器因其地理位置和强大的网络基础设施而备受青睐,但要充分利用其优势,需要综合考虑多种因素。本文将探讨如…

233 基于matlab的多通道非负矩阵分解(MNMF)算法

基于matlab的多通道非负矩阵分解(MNMF)算法。其能够寻找到一个非负矩阵W和一个非负矩阵H,满足条件VW*H,从而将一个非负的矩阵分解为左右两个非负矩阵的乘积。使用EM准则对混合信号进行分解。程序已调通,可直接运行。 233 多通道非…

面试被刷,原因居然是不会Git

大家好,我是知微! 假设你是一个刚入行的菜狗程序员,正在开发一个软件。 现在老板需要你加一些功能,此时的你有一些担忧,如果对代码进行大刀阔斧的改动,最终却失败了。之前能正常运行的代码也被改得乱七八糟…

商汤大模型一体机可节约80%推理成本,完成云端边全栈布局

商汤科技在上海举办技术交流日活动 会上商汤发布业内首个“云、端、边”全栈大模型产品矩阵,并推出全新升级的“日日新SenseNova 5.0”大模型体系。 影响至股价方面,商汤(00020.HK)今日开盘后大幅上涨。随后商汤在港交所公告称,商汤集团的…

《看漫画学C++》背后的故事1:艺术与科技的结合

引言: 在数字化浪潮中,艺术与科技的结合催生了无数创新。《看漫画学C》正是这一跨界合作的产物,它不仅是一本编程书籍,更是艺术与科技融合的典范。 一、相遇: 科技与艺术的火花作为一名专注于技术的软件程序员&…

【JAVA基础之IO】字节流、字符流以及乱码问题

🔥作者主页:小林同学的学习笔录 🔥mysql专栏:小林同学的专栏 目录 1. IO概述 1.1 什么是IO 1.2 IO的分类 1.3 字节和字符流的顶级父类 2. 字节流 2.1 一切皆为字节 2.2 字节输出流【OutputStream】 2.3 FileOutputStream类…

mfc140.dll丢失如何修复,分享多种有效的修复方法

在日常操作和使用电脑的过程中,我们可能会遇到一种较为常见的问题,即在尝试启动或运行某个应用程序时,系统突然弹出一个错误提示窗口,明确指出“mfc140.dll文件丢失”。这个mfc140.dll实际上是一个动态链接库文件(DLL&…

Flask框架初探-如何在本机发布一个web服务并通过requests访问自己发布的服务-简易入门版

Flask框架初探 在接触到网络框架之前我其实一直对一个事情有疑惑,跨语言的API在需要传参的情况下究竟应该如何调用,之前做过的项目里,我用python做了一个代码使用一个算法得到一个结果之后我应该怎么给到做前端的同学或者同事,之前…

微信小程序使用echarts组件实现饼状统计图功能

微信小程序使用echarts组件实现饼状统计图功能 使用echarts实现在微信小程序中统计图的功能,具体的实现步骤思路可进我主页查看我的另一篇博文https://blog.csdn.net/weixin_45465881/article/details/138171153进行查看,本篇文章主要使用echarts组件实…

移动桌面均覆盖-免费使用,解锁VIP!

hello,我是小索奇 分享一下剪映,附带windows和移动端哈 软件内所有功能都已经解锁了哈!不登录也是会员特权~ 相对于PR来说,用剪映省去了好多痛苦(用过的都懂,都是包装) 软件下载好之后双…

【计算机考研】计算机行业考研还有性价比吗?

刚上大学的时候觉得本科毕业就够了 到了大三找工作才发现自己什么都不会 只能踏上考研路 目前研一在读,身边有很多工作了几年又回来读研的同学,只能说现在计算机行业研究生还是比本科生有竞争力的 如果你的本科和我一样没有学什么技术,那…

实现Node.js安装与配置。

一 、Node.js简介 Node.js是一个基于Chrome V8引擎的JavaScript运行时环境,用于构建高性能、可扩展的网络应用程序。它发布于2009年5月,由Ryan Dahl开发,允许使用JavaScript进行服务器端编程,使开发者能够在前后端都使用同一种编程…

MessageBox的模版语法上如何注册事件

目标: 想要在MessageBox中的文本中写一些事件,如何处理 在vue中进行操作: coding // 弹窗提示 this.$confirm({customClass: "add-fail",title: this.$t(add_error),type: error,dangerouslyUseHTMLString: true, // 将消息使用…

【学习笔记二十六】EWM 盘点后台配置和前台演示

一、EWM盘点业务概述 SAP EWM(Extended Warehouse Management)模块中的盘点业务是一个关键流程,它允许企业对仓库中的库存进行实物清点,以确保系统中记录的数据与实际库存相符。盘点过程有助于企业识别库存差异,从而进行必要的库存调整,确保库存记录的准确性,这对于财务…
最新文章