这是网上数据库例题经常使用的两张表emp和dept表,第一个是dept,第二个是emp
为了方便观看,我给上面加了每列的字段名称
1.hive不支持部分子查询
比如这个题目:查询出工资比SMITH高的员工名称
mysql一句话就可以结束了
select ename from emp where sal>(select sal from emp where ename='SMITH');
我们在hive中运行这个是会报错的
hive> select ename from emp where sal>(select sal from emp where ename='SMITH');
hive不支持where后面跟子查询 这些包括
where >子查询语句
where <子查询语句
where = 子查询语句
where <> 子查询语句
select ename from emp where sal>(select sal from emp where ename='SMITH');
select ename from emp where sal<(select sal from emp where ename='SMITH');
select ename from emp where sal=(select sal from emp where ename='SMITH');
select ename from emp where sal<>(select sal from emp where ename='SMITH');
给出解决办法是:
我们需要对这2张表的每一行打上一个标签,然后连接2张表,在where后面筛选条件
比如这个题目里的求得是工资大于smith的人
也就是我们遇到这种问题的时候得先考虑表连接,二次查询中在where放入对应的筛选条件
select e.ENAME
,e.SAL
from
(select ENAME
,SAL
,1 as cid
from emp)e
left join
(select SAL
,1 as cid
from emp
where ENAME='SMITH')
s on e.cid=s.cid
where e.SAL>s.SAL;
2.hive不支持非等值连接
select * from emp join dept on emp.DEPTNO>dept.DEPTNO;
hive不支持非等值连接,我写大于 、小于、不等于 都是不行的
因为mapreduce 很难将这些条件处理成一个map任务
hive> select * from emp join dept on emp.DEPTNO>dept.DEPTNO;
hive> select * from emp join dept on emp.DEPTNO select * from emp join dept on emp.DEPTNO<>dept.DEPTNO;
//统一报错:
FAILED: SemanticException [Error 10017]: Line 1:31 Both left and right aliases encountered in JOIN 'DEPTNO'
解决办法还没想到,日后更新
3.hive支持多表连接查询
hive对join对象启动一个mapreduce任务,对表e和表d连接后,在启动一个mapreduce任务,将上面的连接结果再和下面的表l连接
hive是按从左往右的顺序执行的,所以不用担心表e会跳过表d直接和表l连接
select e.ename,d.deptno,l.name
from emp e
join dept d
on d.deptno=e.deptno
join location l
on d.loc=l.loc;
4.hive中的笛卡尔积
1.省略了连接条件
2.连接条件无效
3.所有表中的所有行互相连接
hive> select empno,deptname from emp,dept;
5.hive连接谓词不支持or
这种写法在mysql可以,但是hive报错
select e.empno,d.dname from emp e
join
dept d
on e.deptno=d.deptno or e.job=d.job;
所以怎么做呢? 将2个筛选条件分开写成2个语句,再用union拼接起来,最后进行去重
select DISTINCT tmp.ename,tmp.dname from
(select e.ename,d.dname,e.deptno,e.job from emp e
join
dept d
on e.deptno=d.deptno
union all
select e.ename,d.dname,e.deptno,e.job from emp e
join
dept d
on e.job=d.job) tmp