1) show function ; 查询所有的函数
2) desc function "函数名" ; 查看某个函数具体的语法(怎么用)
1) 求总行数(count) : hive (default)> select count(*) cnt from emp; ---cnt 是总行数的别名
2) 求工资的最大值 : hive (default)> select max(sal) max_sal from emp; ---max_sal 是最大值的别名
3) 求工资最小值 : hive (default)> select min(sal) min_sal from emp; ---min_sal 是最小值的别名
4) 求工资总和 : hive (default)> select sum(sal) sum_sal from emp;
5) 求工资平均值 : hive (default)> select avg(sal) avg_sal from emp;
典型的查询会返回多行数据 .Limit 子句用于限制返回的行数
hive (default)> select * from emp limit 5; ----每一页5条数据
-------参数1 起始的行数 0开始计数
-------参数2 每页显示的条数
hive (default)> select * from emp limit 2, 5;
1 比较运算符(between..and.. / is null / in)
1.1 案例实操 :
1) 查询出工资等于10000的所有员工的信息-------where 基本用法
hive (default)> select * from where sal=10000;
2) 查询出薪水水平在7000到9000之间的员工信息
hive (default)> select * from where sal between 7000 and 9000;
3) 查询提成为空的员工信息
hive (default)> select * from where commission is null;
4) 查询工资是15000或者20000的员工信息
hive (default)> select * from where sal =15000 or sal =20000 ;
hive (default)> select * from where sal in(15000,20000) ;
2 like 和 rlike
2.1 like 运算符表示类似的值
2.2 选择条件可以包含字符或者数字(%代表0个或者多个字符/任意个字符 ; _ 代表一个字符)
2.3 rlike 子句是 hive 中选择功能的一个扩展 ,其可以通过 java 的正则表达式这个更强大的语言来指定匹配条件
2.4 案例实操 :
1) 查找以 2 开头薪水的员工信息
hive (default)> select * from tb_emp where sal like '2%'
2) 查找第二个数值为 2 的薪水的员工信息
hive (default)> select * from tb_emp where sal like '_2%' --- _ 下划线代表占一个字符
3) 查找薪水中包含有 2 的员工信息
hive (default)> select * from tb_emp where sal rlike '[2]' ---正则表达式
hive (default)> select * from tb_emp where sal like '%2%'
3 逻辑运算符 (and / or / not)
hive 中不支持 ON 的不等连接
3.1 案例实操
1) 查询出薪水水平大于10000并且年龄大于30岁的员工信息
hive (default)> select * from where sal >10000 and age>30 ;
2) 查询出薪水水平大于10000或者年龄大于30岁的员工信息
hive (default)> select * from where sal >10000 or age>30 ;
3) 查询薪资水平除了15000 和20000以外的员工信息
hive (default)> select * from where sal not in(15000, 20000) ;
1 Group By 语句
1.1 group by 语句通常会和聚合函数一起使用 ,按照一个或者多个列队结果进行分组 ,然后对每个组执行聚合操作.
1.2 案例实操
1) 计算 emp 表每个部门的平均工资水平
hive (default)> select emp.deptno, avg(emp.sal) avg_sal from emp group by emp.deptno;
2) 计算 emp 每个部门中每个岗位的最高薪水
hive (default)> select emp.deptno,emp.job max(emp.sal) max_sal from emp group by emp.deptno , emp.job;
2 Having 语句
2.1 having 与 where 的不同点
1) where 针对表中的列发挥作用 ,查询数据; having 针对查询结果中的列发挥作用,筛选数据 .
2) where 后面不能写分组函数 ,而 having 后面可以使用分组函数
3) having 只用于 group by 分组统计语句
2.2 案例实操
1) 求每个部门的平均薪水大于2000的部门
--------求每个部门的平均工资 group by
hive (default)> select deptno, avg(sal) from emp group by deptno;
--------求每个部门的平均薪水大于2000的部门
hive (default)> select deptno, avg(sal) avg_sal from emp group by deptno having avg_sal > 2000;
1.1 hive 支持通常的 sql join 语句 ,但是只支持等值连接 ,不支持非等值连接
hive (default)> select * from tb_name1 join tb_name2 on tb_name1.deptno = tb_name2.deptno;
hive (default)> select * from tb_name1 join tb_name2 on tb_name1.deptno != tb_name2.deptno;
1.2 案例实操
根据员工和部门表中的部门编号相同 ,查询员工编号,员工名字和部门名字
hive (default)>select emp.empno,emp.ename,dept.dname from emp join dept on emp.deptno = dept.deptno;
2.1 好处 : 使用别名可以简化查询 ; 使用别名前缀可以提高执行效率
2.2 案例实操
根据员工和部门表中的部门编号相同 ,查询员工编号,员工名字和部门名字
hive (default)>select e.empno,e.ename,d.dname from emp e join dept d on e.deptno = d.deptno;
Join 操作符左边表中符合 where 子句的所有记录将会被返回(以左边表为主)
hive (default)> select e.empno, e.ename, d.deptno from emp e right join dept d on e.deptno= d.deptno;
Join 操作符右边表中符合 where 子句的所有记录将会被返回(以右边表为主)
hive (default)> select e.empno, e.ename, d.deptno from emp e left join dept d on e.deptno= d.deptno;
注意:连接 n个表,至少需要n-1个连接条件。例如:连接三个表,至少需要两个连接条件。
1) 大多数情况下,Hive会对每对JOIN连接对象启动一个MapReduce任务。本例中会首先启动一个MapReduce job对表e和表d进行连接操作,然后会再启动一个MapReduce job将第一个MapReduce job的输出和表l;进行连接操作。
2) 为什么不是表d和表l先进行连接操作呢?这是因为Hive总是按照从左到右的顺序执行的。
5.1 创建表
create table if not exists tb_location(
loc int,
loc_name string
)
row format delimited fields terminated by '\t';
5.2 加载数据
hive (default)> load data local inpath '/root/location.txt' into table default.tb_location;
5.3 多表连接查询
hive (default)>SELECT
e.ename,
d.deptno,
lo.loc_name
FROM
emp e ----别名
JOIN
dept d
ON d.deptno = e.deptno
JOIN
location lo
ON d.loc = lo.loc;
案例实操
hive (default)> select empno, dname from tb_emp, tb_dept;
1.1 使用 order by 子句排序
order by time asc 升序(默认的) ,asc (ascend)是可以省略的
order by time desc 降序 ,(descend) 不可以省略
1.2 order by 子句在 select 语句的结尾
1.3 案例实操
1) 查询员工信息按工资升序排列
hive (default)> select * from tb_emp order by sal;
2) 查询员工信息按工资降序排列
hive (default)> select * from tb_emp order by sal desc;
按照员工薪水的2倍排序
hive (default)> select ename,sal*2 twosal from tb_emp order by twosal;
按照部门和工资升序排序
hive (default)> select ename,deptno,sal from tb_emp order by deptno,sal;
sort by : 每个 reduce 内部进行排序 ,对全局结果集来说不是排序
4.1 设置 reduce 个数 : set mapreduce.job.reduce = 3
4.2 查看设置 reduce 个数 : set mapreduce.job.reduces;
4.3 根据部门编号降序查看员工信息 : select * from emp sort by empno desc;
4.4 将查询结果导入到本地文件中(按照部门编号降序排列) : overwrite(重写 ,覆盖的意思)
insert overwrite local directory '/root/hive' select * from emp sort by deptno desc ;
5.1 Distribute By : 类似 MR 中 partition ,进行分区,结合 sort by 使用
5.2 注意 : hive 要求 distribute by 语句要写在 sort by 语句之前
5.3 对于 distribute by 进行测试, 一定要分配多reduce进行处理 ,否则无法看到distribute by 的效果
5.4 案例实操 :
按照部门编号分区 ,再按照员工编号降序排序
hive (default)> set mapreduce.job.reduces=3;
hive (default)> insert overwrite local directory '/root/data/distribute-result' select * from emp distribute by deptno sort by empno desc;