一、数据排序

1.order by:全局排序

select * from student order by score desc;

2.sort by :内部排序
每个mapreduce内部进行排序,对全局结果集来说不是排序。
1.设置reduce个数: set mapreduce.job =3;
2.查看设置reduce个数:set mapreduce.job 3.将查询结果导入到文件中(排序):insert overwrite local directory ' /路径' select * from score sort by s_score;

3.distribute by: 分区排序
注意,hive中要求distribute by 使用在SORT BY语句之前

4.cluster by=distribute by + sort by
注意,排序不支持这ASC/DESC。

二、窗口函数

1.为什么要使用窗口函数:
窗口函数可以进行排序,生成序列号等一般的聚合函数无法实现的高级操作。

分组和排序

但是这些功能我们的group by和order by不是就可以实现了吗?看差别:

场景:统计各班人数

当我们使用group by来分组统计的时候

hive windows 滑动窗口 hive窗口函数分组排序_大数据


当我们使用窗口函数的时候

hive windows 滑动窗口 hive窗口函数分组排序_hive windows 滑动窗口_02


明显当我们使用group by分组时改变了原来数据库的行数,即生成了一张新表,但是使用窗口函数的时候并不会影响到我们的行数,这样我们在进行既需要分组又需要显示详细信息的时候可以使用该函数.

2.那么为什么叫窗口函数?
这是因为该函数在分组后的结果被称为"窗口"

窗口函数的语法:

<窗口函数> over (partition by <用于分组的列名>
order by <用于排序的列名>)

窗口函数中的partition by是对表中需要分组的列来进行分组的

三、窗口函数的小总结

sum(col) over() : 分组对col累计求和,over() 中的语法如下
count(col) over() : 分组对col累计,over() 中的语法如下
min(col) over() : 分组对col求最小
max(col) over() : 分组求col的最大值
avg(col) over() : 分组求col列的平均值
first_value(col) over() : 某分区排序后的第一个col值
last_value(col) over() : 某分区排序后的最后一个col值
lag(col,n,DEFAULT) : 统计往前n行的col值,n可选,默认为1,DEFAULT当往上第n行为NULL时候,取默认值,如不指定,则为NULL
lead(col,n,DEFAULT) : 统计往后n行的col值,n可选,默认为1,DEFAULT当往下第n行为NULL时候,取默认值,如不指定,则为NULL
ntile(n) : 用于将分组数据按照顺序切分成n片,返回当前切片值。注意:n必须为int类型。

排名函数:
row_number() over() : 排名函数,不会重复,适合于生成主键或者不并列排名
rank() over() : 排名函数,有并列名次,名次不连续。如:1,1,3
dense_rank() over() : 排名函数,有并列名次,名次连续。如:1,1,2