目录
1.表操作之4个by,分别是
2.Order by:全局排序
3.Cluster by
4.Distribute by :分区
5. Sort by :每个Reduce内部排序
6.操作练习
步骤一.创建表
步骤二.加载数据
步骤三.验证数据
1.表操作之4个by,分别是
order by 排序字段名
cluster by 分桶并排序字段名
distribute by字段名sort by字段名
2.Order by:全局排序
order by排序永远都是全局排序,不受reduces数量影响,每次只用1个reduces
当你使用order by时,默认只走一个reduce,和你设多少个reduce个数无关;
select * from 表名 order by 表内字段名;
缺点:当数据量非常大时,耗时太长,效率低下,适用于数据量较小的场景;
优点:数据全局排序;
3.Cluster by
cluster by 字段名: 分桶且正序排序
弊端: 分桶和排序是同一个字段,相对不灵活
注意: 需要你预先设置reduce个数,结果各个reduce文件内部有序,全局无序;
包含了分桶与排序,但排序默认是升序,无法与SORT BY,ASC或者DESC一起使用
--查询reduces的数量
set mapreduce.job.reduces; --默认-1个
--修改reduces数量
set mapreduce.job.reduces = ; --修改为所需的数量
select * from 表名 cluster by 表内字段名;
4.Distribute by :分区
distribute by 字段名 sort by 字段名,distribute by负责分,sort by负责排序, 相对比较灵活
控制特定的key到指定的reducer,方便后续的聚集操作,类似MR中partition(自定义分区),一般结合sort by使用;
注意: 需要你预先设置reduce个数,结果各个reduce文件内部有序,全局无序;
1. distribute by的分区规则是根据分区字段的hash码与reduce的个数进行模除后,余数相同的分到一个区。
2. Hive要求distribute by语句要写在sort by语句之前;
--查询reduces的数量
set mapreduce.job.reduces; --默认-1个
--修改reduces数量
set mapreduce.job.reduces = ; --修改为所需的数量
select * from 表名 distribute by 字段名 sort by 字段名 asc|desc ;
5. Sort by :每个Reduce内部排序
distribute by 字段名 sort by 字段名,distribute by负责分,sort by负责排序, 相对比较灵活
对于大规模的数据集 order by 的效率非常低。在很多情况下,并不需要全局排序,此时可以使用 sort by
Sort by 为每个 reducer 产生一个排序文件。每个 Reducer 内部进行排序,对全局结果集来说不是排序。
适用于数据量较大,但对排序要求不严格的场合,可以大幅度提升执行效率;
注意: 需要你预先设置reduce个数,结果各个reduce文件内部有序,全局无序;
--查询reduces的数量
set mapreduce.job.reduces; --默认-1个
--修改reduces数量
set mapreduce.job.reduces= ; --修改为所需的数量
select * from 表名 distribute by 字段名 sort by 字段名 asc|desc ;
6.操作练习
现有学生表
需求:按照性别进行分类,再按照年龄进行降序排序
步骤一.创建表
-- 创建表
create table stu(
id int,
name string,
gender string,
age int,
cls string
)row format delimited fields terminated by ',';
步骤二.加载数据
学生表txt文件
上传文件到hdfs中,并加载到表
load data inpath '/input/students.txt' into table stu;
步骤三.验证数据
select * from stu;
进行分桶排序查询
--查询reduces的数量
set mapreduce.job.reduces; --默认-1个
--修改reduces数量为2
set mapreduce.job.reduces=2; --修改后为2
select * from stu distribute by gender sort by age desc ;