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      100select *
from pivot1 
pivot(max(score) as score1 for subject in('语文','英语'));
-- 执行结果
name    语文    英语
王五    99      NULL
李四    90      80
张三    95      85select *
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.0select *
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       2select *
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.mzph.cn/bicheng/3006.shtml

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

相关文章

求最小公倍数

两种方法 1.直接求 import java.util.Scanner;/*** HJ108 求最小公倍数 - 简单*/ public class HJ108 {public static void main(String[] args) {Scanner sc new Scanner(System.in);while(sc.hasNextInt()){int n1 sc.nextInt();int n2 sc.nextInt();for(int i 1; i &l…

quasar框架切换Tab页使用<keep-alive>缓存

写法1 : 使用quasar的q-tabs组件使用方法 //布局样式根据需求自己设置 <template><div class"all-Tabs"><q-tabs v-model"activeTabName" update:model-value"selectedChange"><q-tabv-for"(item, index) in cardAr…

Elasticsearch 索引数据多了,调优,部署方案

1&#xff1a;动态索引层面 基于 模板时间rollover api 滚动 创建索引&#xff0c;举例&#xff1a;设计阶段定义&#xff1a;blog 索引的模板格式为&#xff1a;blog_index_时间戳的形式&#xff0c;每天递增数据。这样做的好处&#xff1a;不至于数据量激增导致单个索引数据量…

sklearn混淆矩阵的计算和seaborn可视化

为了计算语义分割的指标miou&#xff0c;需要生成的中间过程就是混淆矩阵。 iou intersection / union 每个类别的平均iou就是mean iou。 使用sklearn自带的confusion_matrix能很容易生成混淆矩阵&#xff0c;可以进行混淆矩阵的可视化观察哪个类别分割的不好。 from skle…

【go从入门到精通】深入剖析反射

作者简介: 高科,先后在 IBM PlatformComputing从事网格计算,淘米网,网易从事游戏服务器开发,拥有丰富的C++,go等语言开发经验,mysql,mongo,redis等数据库,设计模式和网络库开发经验,对战棋类,回合制,moba类页游,手游有丰富的架构设计和开发经验。 (谢谢你…

OAuth2、JWT

文章目录 OAuth2JWT OAuth2 官网&#xff1a; https://oauth.net/2/ 在 RFC 6749 中说明 1、资源所有者 resource owner&#xff0c; 如 github 用户 2、客户端/第三方应用 client&#xff0c; 如 支持github 登录的 csdn 3、资源服务器 resource server&#xff0c; 如 4、授…

深入浅出MySQL-04-【常用函数】

前言 环境&#xff1a; Window11MySQL-8.0.35 1.字符串函数 最常用的一种函数。 注意&#xff1a;在 MySQL 中&#xff0c;字符串的下标&#xff08;或称为索引&#xff09;是从 1 开始的&#xff0c;而不是从 0 开始。 函数功能CONCAT(s1, s2, …, sn)连接s1, s2, …, s…

【高阶数据结构】B树 {B树的概念;B树的实现:节点设计,查找,插入,遍历,删除;B树的性能分析;B+树和B*树;B树的应用}

一、常见的搜索结构 以上结构适合用于数据量相对不是很大&#xff0c;能够一次性存放在内存中&#xff0c;进行数据查找的场景。如果数据量很大&#xff0c;比如有100G数据&#xff0c;无法一次放进内存中&#xff0c;那就只能放在磁盘上了&#xff0c;如果放在磁盘上&#xff…

如何查看连接的Linux服务器是ubuntu还是centos

测试环境 Ubuntu 22.04.4CentOS Linux release 7.9.2009 (Core) centos使用以下命令 cat /etc/centos-release结果 CentOS Linux release 7.9.2009 (Core)或者 cat /etc/issue结果 \S Kernel \r on an \mubuntu使用以下命令 cat /etc/issue结果 Ubuntu 22.04.4 LTS \n …

全局路线规划导读

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言一、全局路径探索的介绍二、基于定位的全局航线的录制方法扩展阅读可参考 三、曲线拟合的方法--Dubins曲线与Reeds-Shepp曲线…

Linux系统安全:从面临的攻击和风险到安全加固、安全维护策略(文末有福利)

1. Linux面临的攻击与风险 1.1. Linux系统架构 Linux系统架构解读&#xff1a; 用户之间隔离内核态与用户态之间隔离用户进程一般以低权限用户运行系统服务一般以特权服务运行用户态通过系统调用进入内核态内核对系统资源进行管理和分配 1.2. Linux系统常见安全威胁 1.2.1.…

Qt/C++音视频开发71-指定mjpeg/h264格式采集本地摄像头/存储文件到mp4/设备推流/采集推流

一、前言 用ffmpeg采集本地摄像头&#xff0c;如果不指定格式的话&#xff0c;默认小分辨率比如640x480使用rawvideo格式&#xff0c;大分辨率比如1280x720使用mjpeg格式&#xff0c;当然前提是这个摄像头设备要支持这些格式。目前市面上有一些厂家做的本地设备支持264格式&am…

目标检测——YOLOv7算法解读

论文&#xff1a;YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors (2022.7.6) 作者&#xff1a;Chien-Yao Wang, Alexey Bochkovskiy, Hong-Yuan Mark Liao 链接&#xff1a;https://arxiv.org/abs/2207.02696 代码&#xff1a;h…

C++_第八周做题总结

id:45 A.Equation(类与对象构造) 题目描述 建立一个类Equation&#xff0c;表达方程ax2bxc0。类中至少包含以下方法&#xff1a; 无参构造&#xff08;abc默认值为1.0、1.0、0&#xff09;与有参构造函数&#xff0c;用于初始化a、b、c的值&#xff1b; set方法&#xff0c;…

哈希封装unordered系列关联式容器

文章目录 补档HashTable迭代器基本框架具体实现 HashTable模板化具体实现 UnorderedSet封装具体实现 UnorderMap封装 补档 上一次我们在使用哈希函数时说&#xff0c;利用仿函数可以解决不知道哈希表内存的数据类型时对哈希函数也可以进行计算&#xff0c;但是当时只给了一个框…

Android判断应用是否在前台运行

Android判断应用是否在前台运行 /*** Android判断应用是否在前台运行* 0&#xff1a;异常&#xff1b;1&#xff1a;前台&#xff1b;2&#xff1a;后台&#xff1b;3&#xff1a;未运行&#xff1b;*/private int isFrontShow(Context context) {if (context null) {ret…

基于STM32 的机场安检闸机排队系统

项目&#xff1a;基于STM32 的机场安检闸机排队系统 应用场景&#xff1a;现实中可能涉及到人数限额排队的情况下使用&#xff0c;例如安检&#xff08;不能一次性通过太多人数&#xff1a;机场、高铁站、地铁等&#xff09;&#xff0c;电梯人数限额&#xff08;一个电梯内限…

【Java那些年系列-启航篇 03】JDK、JRE和JVM之间是什么关系?

作者名称&#xff1a;纸飞机-暖阳 作者简介&#xff1a;专注于Java和大数据领域&#xff0c;致力于探索技术的边界&#xff0c;分享前沿的实践和洞见 文章专栏&#xff1a;Java那些年专栏 专栏介绍&#xff1a;本专栏涵盖了 Java SE从基础语法到面向对象编程&#xff0c;从异常…

VS2019中配置C++ OpenCV 4.5.4完整指南

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的在读研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三…

STM32标准库ADC和DMA知识点总结

目录 前言 一、ADC模数转换器 &#xff08;1&#xff09;AD单通道 &#xff08;2&#xff09;AD多通道 二、DMA原理和应用 &#xff08;1&#xff09;DMA数据转运&#xff08;内存到内存&#xff09; &#xff08;2&#xff09;DMAAD多同道&#xff08;外设到内存&#x…