准备阶段
- 准备一个保存员工信息的文件 包含每个员工的姓名 部门和成绩
jack 测试 60
tom 开发 88
shy 销售 56
duke 开发 95
zoom 销售 26
penut 销售 63
leyan 销售 77
jkl 开发 54
ning 测试 12
faker 销售 99
wwk 销售 68
baolan 测试 55
uzi 测试 66
letme 开发 78
- 然后创建一个myuser表
create external table myuser
(
name string,
type string,
score int
) row format delimited fields terminated by ' ';
- 加载数据
load data local inpath '/root/user.txt' into table myuser;
全局排序
- Order By:全局排序,只有一个reduce
- 按照员工成绩对所有员工降序排序 select * from myuser order by score desc;
faker 销售 99
duke 开发 95
tom 开发 88
letme 开发 78
leyan 销售 77
wwk 销售 68
uzi 测试 66
penut 销售 63
jack 测试 60
shy 销售 56
baolan 测试 55
jkl 开发 54
zoom 销售 26
ning 测试 12
局部排序(Sort By)
-
Sort By:每个MapReduce内部进行排序,对全局结果集来说不是完全有序。
-
设置reduce个数为3
set mapreduce.job.reduces=3; -
然后使用sort by对进行局部排序,select * from myuser sort by score;
-
可以发现每个reduce内部是有序的
baolan 测试 55
shy 销售 56
wwk 销售 68
letme 开发 78
tom 开发 88
duke 开发 95
ning 测试 12
zoom 销售 26
jkl 开发 54
penut 销售 63
leyan 销售 77
faker 销售 99
jack 测试 60
uzi 测试 66
分区排序(DISTRIBUTE BY)
- Distribute By:其实就是先根据字段a对数据进行分区 ,再根据字段b对每个分区内部进行排序。
- 因为有三个部门这里设置reduce个数为3
set mapreduce.job.reduces=3;
- 先根据部门进行分区,再对每个分区内部员工按照成绩进行排序
select * from score distribute by s_id sort by s_score;
CLUSTER BY
- 当distribute by和sort by字段相同时,可以使用cluster by方式。 cluster by除了具有distribute by的功能外还兼具sort by的功能。
- 结果根据name分区,每个分区内部根据name排序
//以下两种写法等价
select * from myuser cluster by name;
select * from myuser distribute by name sort by name;
- 两种写法排序结果均如下
baolan 测试 55
jack 测试 60
letme 开发 78
penut 销售 63
shy 销售 56
jkl 开发 54
leyan 销售 77
tom 开发 88
wwk 销售 68
zoom 销售 26
duke 开发 95
faker 销售 99
ning 测试 12
uzi 测试 66