hive中排序除了order by之外,还有 sort by,还有 cluster by,还有 distribute by。
--order by排序
不管表格有多大的数据量,都是将表格当成一个整体,放在一个reduce进程中进行排序的。order by排序很慢。
select * from 表 order by 列名 desc|asc;
--sort by排序
是在reduce中进行排序的,有几个reduce,就会在几个不同的范围内分别排序。当reduce等于1的时候,效果和order by 是一样的。
怎样设置reduce的数目:
set mapred.reduce.tasks; 这个开关的默认值是-1,表示没有逼迫限定,reduce的数目是跟着分桶或者文件的多少来决定的。
select * from 表 sort by 列 desc|asc;
--distribute by排序
distribute by 其实就是在查询的过程中,对表格进行分桶的含义。
distribute by 是不能单独运行的,只能和 sort by 结合使用。
select * from 表 distribute by 分桶字段 sort by 排序字段 desc|asc; -- cluster by排序
其实就是
select * from 表 distribute by 分桶字段 sort by 按照分桶字段进行排序 asc;
select * from 表 cluster by 列;
select * from emp distribute by sal sort by sal;
select * from emp cluster by sal;
两句话是一样的效果
复制代码
多表查询
1.子查询嵌套
select * from (select deptno,sum(sal) s from emp group by deptno) t; 在hive中,嵌套的子查询,必须要有个别名。
2.多表团结查询
cross join 笛卡尔积:显示两个表所有大概的连接情况
inner join 内连接:查询出两个表格之间共有的数据部门
left join 外连接之左连接:查询出两个表格的共有数据,然后显示出左边表格独有的数据。
right join 外连接之右连接:查询出两个表格的共有数据,然后显示出右边表格独有的数据。
full join 外连接之全连接:查询出两个表格的共有数据,然后分别显示左表和右表独有的数据。
在Hive中,多了一个左半连接的操作:在hive2.x的版本中,不能使用子查询嵌套的语法,用left semi join对嵌套进行语法的替换操作。
select * from a left semi join b on a.xx=b.xx; 这里的*号,代表的不是a和b表的所有字段,只代表a表的所有的字段。
-- 查询工资比MILLER要高的员工信息
select * from emp where sal>(select sal from emp where ename='MILLER');
select * from emp a left semi join emp b on a.ename!='MILLER' and b.ename='MILLER'