查询语句
常用函数
求总行数(count)
hive (default)> select count(*) cnt from emp;
求工资的最大值(max)
hive (default)> select max(sal) max_sal from emp;
求工资的最小值(min)
hive (default)> select min(sal) min_sal from emp;
求工资的总和(sum)
hive (default)> select sum(sal) sum_sal from emp;
求工资的平均值(avg)
hive (default)> select avg(sal) avg_sal from emp;
Limit语句典型的查询会返回多行数据。LIMIT子句用于限制返回的行数。
hive (default)> select * from emp limit 5;
分组
group by语句通常会和聚合函数一起使用,按照一个或者多个列队结果进行分组,然后对每个组执行聚合操作
计算emp表每个部门的平均工资
hive (hive)> select avg(sal) avg_sal, deptno from emp group by deptno;
计算emp表每个部分中每个岗位的最高薪水
select deptno,job,max(sal) max_sal from emp group by deptno, job;
having:
having和where不同点
1.where针对表中列发挥作用,查询数据,Having针对查询结果中的列发挥作用,筛选数据
2. where后面不能写分组函数,而having后面可以使用分组函数
3. having只用于group by分组统计语句
求每个部门的平均薪水大于2000的部门
select deptno,avg(sal) avg_sal from emp group by deptno having avg_sal > 2000;
jion语句
等值join
Hive只支持等值连接,不支持非等值连接
根据员工表和部门表中的部门编号相等,查询员工编号,员工名称,部门编号
hive (hive)> select e.empno, e.ename, d.deptno from emp e join dept d on e.deptno = d.deptno; e.empno e.ename d.deptno 7369 SMITH 20 499 ALLEN 30 7521 WARD 30 7566 JONES 20
表的别名
好处
使用别名可以简化查询,表名前缀,提高执行效率
内连接
只进行连接的两个表中都存在于连接条件相匹配的数据才会被保留下来
案例如等值join
左外连接
jion操作符左边表中符合where子句的所有记录将会被返回
select e.empno, e.ename, d.deptno from emp e left join dept d on e.deptno = d.deptno;
右外连接
jion 操作符右边表中符合where子句的所有记录将会被返回
select e.empno, e.ename, d.deptno from emp e right join dept d on e.deptno = d.deptno;
满外连接
将所有表中符合where语句条件的所有记录,
如果任一表中的指定字段没有符合条件的值的话,用null替代
select e.empno, e.ename, d.deptno from emp e full join dept d on e.deptno = d.deptno;
多表连接
连接n个表,至少需要n-1个条件,例如,连接三个表,至少需要两个连接条件
数据源
1700 Beijing
1800 London
1900 Tokyo
创建位置表
hive (hive)> create table location(loc int,loc_name string) row format delimited fields terminated by '\t
加载数据
hive (hive)> load data local inpath '/opt/datas/location.txt' into table location;
多表连接查询
hive (hive)> select e.ename,d.deptno,l.loc_name from emp e join dept d on d.deptno = e.deptno join location l on l.loc = d.loc;
结果
e.ename d.deptno l.loc_name
SMITH 20 London
ALLEN 30 Tokyo
WARD 30 Tokyo
JONES 20 London
MARTIN 30 Tokyo
BLAKE 30 Tokyo
CLARK 10 Beijing
SCOTT 20 London
KING 10 Beijing
TURNER 30 Tokyo
ADAMS 20 London
JAMES 30 Tokyo
FORD 20 London
MILLER 10 Beijing
大多数情况下,Hive会对每对JOIN连接对象启动一个MapReduce任务。本例中会首先启动一个MapReduce job对表e和表d进行连接操作,然后会再启动一个MapReduce job将第一个MapReduce job的输出和表l;进行连接操作。
注意:为什么不是表d和表l先进行连接操作呢?这是因为Hive总是按照从左到右的顺序执行的。
笛卡尔积
出现场景
1.省略连接条件 2.连接条件无效 3.所有表中的所有行互相连接