Databricks 第11篇:Spark SQL 查询(行转列、列转行、Lateral View、排序)
本文分享在Azure Databricks中如何实现行转列和列转行。
一,行转列
在分组中,把每个分组中的某一列的数据连接在一起:
- collect_list:把一个分组中的列合成为数组,数据不去重,格式是['a','a','b']
- collect_set:把一个分组中的列合成为集合,数据去重,格式是['a','b']
用于连接文本数组的函数,通过sep把数组中的item分割开,连接成一个字符串:
concat_ws(sep, [str | array(str)]+)
举个例子,把每个用户的game,通过逗号连接起来:
select uid
,concat_ws(",",collect_list(game)) as game_list
from user_game
二,列转行
Explode(expr) 用于处理array和map结构的数据,把一行的列值转换成多行,该函数产生一个虚拟表,包含一行或多行数据,也就是说,Explode(expr)函数把array类型expr中的元素分成多行,或者将map类型的expr中的元素分成多行和多列。
举个例子,把game_list中的每个item转换为一行数据:
with cte_game as
(
select uid
,collect_list(game) as game_list
from user_game
group by uid
)
select uid
,explode(game_list) as game
from cte_game
三,Lateral View子句
Lateral View子句用于连接表值函数(UDTF),比如explode、split 。Lateral View通过UDTF函数把数据拆分成多行,再把多行结果组合成一个虚拟表。
该子句主要解决的问题是:在select使用UDTF做查询的过程中,该查询只能包含单个UDTF,不能包含其它字段以及多个UDTF的情况。
LATERAL VIEW udtf(expression) tableAlias AS columnAlias (',' columnAlias)
使用LATERAL VIEW + explode 函数进行查询,语句如下:
select movie,category_name
from movie_info
LATERAL VIEW explode(category) tmpTable as category_name;
-- category_name 是给 explode(category) 列起的别名
四,排序
在SELECT子句中,ORDER BY子句用于保证最终数据的顺序,除此之外,还可以按照分区来排序。
[ WITH with_query [ , ... ] ]
select_statement[ ORDER BY { expression [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [ , ... ] } ]
[ SORT BY { expression [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [ , ... ] } ]
[ CLUSTER BY { expression [ , ... ] } ]
[ DISTRIBUTE BY { expression [, ... ] } ]
[ WINDOW { named_window [ , WINDOW named_window, ... ] } ]
1,DISTRIBUTE BY子句
根据输入表达式对表进行重新分区,
DISTRIBUTE BY { expression [ , ... ] }
举个例子,把age相同的person作为同一个cluster(或partition)。
SELECT age, name FROM person DISTRIBUTE BY age;
2,SORT BY子句
在每个分区中,按照指定的顺序对每个分区内的数据进行排序,如果分区不止一个,那么SORT BY可能会返回部分排序的结果。
SORT BY { expression [ sort_direction | nulls_sort_order ] [ , ... ] }
参数注释:
nulls_sort_order 的有效值是 NULLS { FIRST | LAST },可选,用于指定在非NULL值之前/之后是否返回NULL值。
如果未指定null_sort_order,则如果排序顺序为ASC,则NULL排在最前面,如果排序顺序为DESC,则NULL排在最后面。
- 如果指定了NULLS FIRST,则无论排序顺序如何,都将首先返回NULL值。
- 如果指定了NULLS LAST,则无论排序顺序如何,最后都会返回NULL值。
举个例子,按照name对每个分区中的数据进行排序:
SELECT /*+ REPARTITION(zip_code) */ name, age, zip_code FROM person
SORT BY name ASC, age DESC;
3,CLUSTER BY子句
根据输入表达式对数据进行重新分区,然后对每个分区内的数据进行排序。从语义上讲,这等效于先执行DISTRIBUTE BY,再执行SORT BY。该子句仅确保结果行在每个分区内排序,并且不保证输出的总顺序。
CLUSTER BY { expression [ , ... ] }
举个例子,按照age把person分区,age相同的person位于同一个分区,然后按照age对每个分区中的person进行排序。
SELECT age, name FROM person CLUSTER BY age;
参考文档:
SQL reference for Databricks Runtime 7.x
Databricks 第11篇:Spark SQL 查询(行转列、列转行、Lateral View、排序)的更多相关文章
- 大数据技术之_19_Spark学习_03_Spark SQL 应用解析 + Spark SQL 概述、解析 、数据源、实战 + 执行 Spark SQL 查询 + JDBC/ODBC 服务器
第1章 Spark SQL 概述1.1 什么是 Spark SQL1.2 RDD vs DataFrames vs DataSet1.2.1 RDD1.2.2 DataFrame1.2.3 DataS ...
- 2. 执行Spark SQL查询
2.1 命令行查询流程 打开Spark shell 例子:查询大于21岁的用户 创建如下JSON文件,注意JSON的格式: {"name":"Michael"} ...
- spark sql 查询hive表并写入到PG中
import java.sql.DriverManager import java.util.Properties import com.zhaopin.tools.{DateUtils, TextU ...
- SQL数据单条转多条(Lateral View)
Lateral View和split,explode等UDTF一起使用,它能够将一行数据拆成多行数据,并在此基础上对拆分后的数据进行聚合. 单个Lateral View语句语法定义如下:lateral ...
- Entity Framework 第四篇 优化SQL查询
Expression<Func<TEntity, bool>>与Func<TEntity, bool>的异同 public IList<TEntity> ...
- sql查询行转列
昨天下午碰到一个需求,一个大约30万行的表,其中有很多重复行,在这些行中某些字段值是不重复的. 比如有ID,NAME,CONTRACT_id,SALES,PRODUCT等,除了PRODUCT字段,其余 ...
- SQL多行转多列
--★转换结果如上图 1.首先创建表: CREATE TABLE [成绩表]( ,) NOT NULL, )NULL, , )NULL, , )NULL, , )NULL ) ON [PRIMARY] ...
- SQL查询结果增加序号列
--sql 2000 ) ,学号 ,姓名 from tb t --sql 2005 select 序号 = row_number() over(order by 学号),学号 ,姓名 from tb ...
- sql 查询表格中多列重复的数据并显示该表的其他列
我们一般情况下通过分组函数group by来查询重复的列 ) R 但是查询出的结果不能显示该表的其他列 想要查询一张表中有多个列重复的数据且也要显示该表的其他列 SELECT M.* FROM [db ...
随机推荐
- 记一次centos7重启后docker无法启动的问题
问题描述 在重新了centos7系统后,docker突然就启动不了了,查看报错信息 [root@localhost ~]# systemctl status docker.service ● dock ...
- 这难道不是.NET5 的bug? 在线求锤?
hello,最近在对一个使用.NET5项目的认证授权系统进行重构,对.NET 5的授权中间件的源码有些看法. 也希望同学们能帮我理解. 一个朴素的需求 这是一个api项目,默认所有的api都需要授权, ...
- 与图论的邂逅05:最近公共祖先LCA
什么是LCA? 祖先链 对于一棵树T,若它的根节点是r,对于任意一个树上的节点x,从r走到x的路径是唯一的(显然),那么这条路径上的点都是并且只有这些点是x的祖先.这些点组成的链(或者说路径)就是x的 ...
- 安装jdk-windows系统
1. 明确需要安装的jdk版本,注意jdk存在小版本号,例如jdk1.7_51,如果不清楚小版本号的话建议安装最新版本的jdk: 2. 打开cmd命令窗口,输入java -version查看本机是否安 ...
- 。SLI,Service Level Indicator,服务等级指标,其实就是我们选择哪些指标来衡量我们的稳定性。而 SLO,Service Level Objective,服务等级目标,指的就是我们设定的稳定性目标,比如“几个 9”这样的目标。
.SLI,Service Level Indicator,服务等级指标,其实就是我们选择哪些指标来衡量我们的稳定性.而 SLO,Service Level Objective,服务等级目标,指的就是我 ...
- It is thread-safe and idempotent, but not reentrant.
https://github.com/django/django/blob/master/django/apps/registry.py
- 隐性 URL 转发代码
隐性转发的优势体现于无需跳转和变动浏览器地址栏,即可实现转发. <!DOCTYPE html> <html lang="zh-CN"> <head&g ...
- Service Mesh 在百度网盘数万后端的落地实践
https://www.infoq.cn/article/vpa6aypkizuqiijzflih
- cookie中的domain和path
div.example { background-color: rgba(229, 236, 243, 1); color: rgba(0, 0, 0, 1); padding: 0.5em; mar ...
- CSS补充2
浮动是css里面布局最多的一个属性效果:两个元素并排了,并且两个元素都能够设置宽度和高度 四个特性: 1.浮动的元素脱标 2.浮动的元素互相贴靠 3.浮动的元素有"字围"效果 4. ...