1,order by 会对输入做全局排序, 因此只有一个 reducer, 会导致当输入规模较大时, 需要较长的计算时间.
2,sort by 不是全局排序, 其在数据进入 reducer 前完成排序. 因此, 如果用 sort by 进行排序, 并且设置 mapred.reduce.tasks>1, 则 sort by 只保证每个 reducer 的输出有序, 不保证全局有序. 即每个文件是有序的. 如果
mapred.reduce.tasks
=1,sort by 结果和 order by 一样, 一般 sort by 不单独使用, 而是和 distribute by 一起使用.
3,distribute by(字段)根据指定的字段将数据分到不同的 reducer, 且分发算法是 hash 散列常和 sort by 排序一起使用.
1).distribute by 负责把文件哈希散列到不同文件, sort by 负责给不同文件进行排序.
2). 当然必须要设置 set mareduce.job.reduces 数量, 设置的 reduces 数量个数, 就是实际 hash 散列的文件个数, 因为 hash 散列的是通过 hash 值与 reduce 个数取模决定存储在哪个文件里的. 所以如果不设置 reduces 个数, 即使 distribute by+sort by 结果还是和 order by 结果一样的.
4,Cluster by(字段) 除了具有 Distribute by 的功能外, 还会对该字段进行类似 sort by 的排序.
因此, 如果分桶和 sort 字段是同一个时, 此时, cluster by = distribute by + sort by
分桶表的作用: 最大的作用是用来提高 join 操作的效率;
(思考这个问题:
select a.id,a.name,b.addr from a join b on a.id = b.id;
如果 a 表和 b 表已经是分桶表, 而且分桶的字段是 id 字段
做这个 join 操作时, 还需要全表做笛卡尔积吗?)
举例说明:(也可用 insert 将查询的结果导出文件)
1. order by 全局排序
- select * from em
- where empno>7800
- order by empno
- limit 3;(显示工号大于 7800 员工的最后三名.)
只是针对所有数据全局排序, 全局排序只有一个 reducer, 效率低. 运行慢.
2.sort by 排序, 为每个 reducer 产生一个排序文件
设置 mapreduce.job.reduces 即 reduce 任务个数 , 如果为 1 跟 order by 解果一样.
set mapreduce.job.reduces; 回车以后显示 mapred.reduce.task 的值
set mapreduce.job.reduces=3; 临时设置的值, 一旦 hive 关闭重启就没用了.
sort by 是在 reduce 之间排序,
- insert overwrite local directory '/home/wang/mydata/sort'
- row format delimited fields terminated by '\t'
- select empno,ename ,deptno from emp
- sort by empno;
结果是 3 个文件夹, 随机分布的数据, 然后给每个文件夹里的数据按 empno 进行了排序.
- insert overwrite directory '/user/hive/'
- row format delimited fields terminated by '\t'
- select empno,ename ,deptno from emp
- sort by empno //sort by (empno asc/dsc)
3.distributed 类似于 mapreduce 里的 patition 分区 (根据指定值 hash 散列到不同文件) 一般要结合 sort by 使用.
- set mapreduce.job.reduces=3;
- insert overwrite local directory '/home/wang/mydata/sort'
- row format delimited fields terminated by '\t'
- select empno,ename,deptno from emp
- distribute by deptno
- sort by empno
这里的输出结果是 sort 下面三个文件夹, 分别是三个部门员工的文件夹, 且每个部门按工号排序
4.cluster by : 除了具有 Distribute by 的分区的功能外, 还会对该字段进行排序
当 distribute 和 sort 字段相同时, 就是 cluster by, 即分区的字段和排序的字段相同
- insert overwrite local directory '/home/wang/mydata/sort'
- row format delimited fields terminated by '\t'
- select empno,ename ,deptno from emp
- distribute by deptno
- sort by deptno;
等价与(cluter 可以用 sort+distribute 替换, 但 d+s,cluster 不一定可以替换)
- insert overwrite local directory '/home/robot/mydata/sort'
- row format delimited fields terminated by '\t'
- select empno,ename ,deptno from emp
- cluster by depno;
来源: http://www.bubuko.com/infodetail-2745459.html