一、炸裂函数注意点
1、只取炸裂字段
select
explode(字段名)
from
表名
2、原表中的字段和炸裂字段
select
表中字段,
列的别名
from
表名
lateral view explode(字段名) 炸裂开表的别名 as 列的别名
二、partition by 与 distribute by
partition by name order by orderdate 与distribute by name sort by orderdate 结果是一样的。
三、窗口函数
current row :当前行
n perceding :往前n行数据
n follewing :往后n行数据
unbonded : 起点 ,unbounded perceding 表示从前面的起点 unbounded following :表示到后面的终点
ntile(n):把有序分区中的行分发到指定数据的组中,各个组有编号,编号从1开始,对于每一行,ntile返回此行所属的组的编号。
理解: 把数据根据顺序分N 组,可以用于取百分子多少的数据
排名函数是窗口函数
rank():1134
dense_rank():1123
row_number():1234
distinct的优化
select
shop,
count( distinct id) uv
from
visit
group by shop
;
--优化用group by 实现去重
select
shop count(id) uv
from
(
select
shop,
id
from visit
group by shop,id
) t1
group by shop
;
三、例题
格式化日期
date_format(regexp_replace(data_dt,'/','-'),'yyyy-MM');
例子1
[外链图片转存失败(img-6cmp9Zps-1569033300770)(C:\Users\12847\Desktop\NOTES\Apart03Hadoop\imgs\例子1.png)]
--数据准备 visit
u01 2017/1/21 5
u02 2017/1/23 6
u03 2017/1/22 8
u04 2017/1/20 3
u01 2017/1/23 6
u01 2017/2/21 8
u02 2017/1/23 6
u01 2017/2/22 4
-- 创建表
create table visit1(
userId string,
visitDate string,
visitCount int)
row format delimited fields terminated by " "
;
-- 查询过程
1、格式化日期
select
userId,
date_format(regexp_replace(visitDate,'/','-'),'yyyy-MM') visiteDate,
visitCount
from
visit1
;