窗口函数
https://www.cnblogs.com/Uni-Hoang/p/17411313.html
sql
<窗口函数> OVER ([PARTITION BY <分组列> [, <分组列>...]]
[ORDER BY <排序列> [ASC | DESC] [, <排序列> [ASC | DESC]]...]
[<rows or range clause>])
)
窗口函数主要是三类:
- 聚合函数,如sum、max、avg、min 等等
- 排序函数,如row_number、rank、dense_rank
- 分析函数,如lead、lag、first_value、last_VALUE
窗口边界的使用详解
preceding 往前
following 往后
current row 当前行
unbounded 起点
unbounded preceding 从前面的起点
unbounded following 到后面的终点
-
如果不指定 PARTITION BY,则不对数据进行分区,换句话说,所有数据看作同一个分区;
-
如果不指定 ORDER BY,则不对各分区做排序,通常用于那些顺序无关的窗口函数,例如 SUM()
-
如果不指定窗口子句,则默认采用以下的窗口定义:
a、若不指定 ORDER BY,默认使用分区内所有行 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING.
b、若指定了 ORDER BY,默认使用分区内第一行到当前值 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.
explode()函数和posexplode()函数
- explode就是将hive一行中复杂的array或者map结构拆分成多行
- posexplode 特点是不仅炸裂出数值,还附带索引,实现多列进行多行转换;
sql
hive>with temp as
( select 'a,b,c,d' as examp_data1,'2:00,3:00,4:00,5:00' as examp_data2)
select
data1
,data2
from temp
lateral view explode(split(examp_data1,',')) view1 as data1
lateral view explode(split(examp_data2,',')) view1 as data2
data1,data2
a,2:00
a,3:00
a,4:00
a,5:00
b,2:00
b,3:00
b,4:00
b,5:00
c,2:00
c,3:00
c,4:00
c,5:00
d,2:00
d,3:00
d,4:00
d,5:00
sql
with temp as
( select 'a,b,c,d' as examp_data1,'2:00,3:00,4:00,5:00' as examp_data2)
select
data1
,data2
from temp
lateral view posexplode(split(examp_data1,',')) view1 as index1,data1
lateral view posexplode(split(examp_data2,',')) view1 as index2,data2
where index1=index2
data1,data2
a,2:00
b,3:00
c,4:00
d,5:00
lateral view 和 lateral view outer 的区别
lateral view explode 炸裂的数组中如果存在null,则这一条数据舍弃;lateral view ourer explode 炸裂的数组中如果存在null,则这一条数据保留,炸裂的字段值填充为null ;