目录
行转列
collect_set() --行转列,去重。不同行转为一个集合,可按序号取值
collect_list() --行转列,不去重。
concat()
concat_ws()
列转行
explode (array):返回多行array中对应的元素。如explode(array('A','B','C'))
explode(map):返回多行map键值对对应元素。如explode(map(1,'A',2,'B',3,'C'))
lateral view explode(split(col1,','))
--同组同列的数据拆分成多行,以sep分隔符区分
LATERAL VIEW:
1.Lateral View 用于和UDTF函数【explode,split】结合来使用。
2.首先通过UDTF函数将数据拆分成多行,再将多行结果组合成一个支持别名的虚拟表。
3..主要解决在select使用UDTF做查询的过程中查询只能包含单个UDTF,不能包含其它字段以及多个UDTF的情况。
4.语法: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) 列起的别名
排序函数
rank() over(partition by .. order by .)
--根据partition排序,相同值,序号相同,序号跳跃
dense_rank() over(partition by .. order by ..)
--根据partition排序,相同值,序号相同,序号不跳跃
row_number() over(partitiion by .. order by .. )
--根据partition排序,相同值,序号不同,序号不跳跃
日期函数
date_format() --日期格式化
to_date(string timestamp) --返回时间字符串中的日期部分
current_date() --返回当前日期
date_add() & date_sub() --加减日期
next_day() --取当前天的下个周一,用作周指标
last_day() --取当月最后一天
date_add(next_day('2019-02-12','MO'),-7) --取当前周的周一
get_json_object解析json函数
nvl(value,default_value) - Returns default value if value is null else returns value
四个By区别
1.Order by:全局排序,只有一个Reduce
2.Sort By:分区内排序
3.Distrbute By:类似MR中Partition,进行分区,结合Sort By使用。
4.Cluster By:当Distrbute By 和Sort By字段相同时候使用,但是排序只能是升序排列,不能指定排序规则为asc或者desc。
窗口函数/开窗函数
OVER()
用于指定分析函数工作时的数据窗口大小,这个数据窗口大小可能会随着行的变而变化;