hive交互命令:
- “-e”不进入hive的交互窗口执行sql语句
hive -e "select id from default.student;" - “-f”执行脚本中sql语句
1)在/opt/datas目录下创建hivef.sql文件
touch hivef.sql 文件中写入正确的sql语句
select *from student;
2)执行文件中的sql语句 hive -f /opt/datas/hivef.sql
3)执行文件中的sql语句并将结果写入文件中 hive -f /opt/datas/hivef.sql > /opt/datas/hive_result.txt - 查看在hive中输入的所有历史命令
1) 进入到当前用户的根目录/root或/home/myx01
2) 查看. hivehistory文件 cat .hivehistory
hive的group by ,sort by,order by ,cluster by,distribute by 五个by的区别:
- group by: 分组,每个组里面只会显示第一行的数据,分组后select 后边只能写被分组的字段或者聚合函数(avg,count,sum,max,min...)
- 计算emp每个部门中每个岗位的最高薪水
select t.deptno, t.job, max(t.sal) max_sal from emp t group by t.deptno, t.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;
- sort by : 区内排序 ASC(ascend): 升序(默认),DESC(descend) 降序
- 查询员工信息按工资升序排列
select * from emp order by sal; - 查询员工信息按工资降序排列
select * from emp order by sal desc; - 按照部门和工资升序排序
select ename, deptno, sal from emp order by deptno, sal ;
- order by: 全局排序,由于是全局排序,所以使用order by 的语句只会有一个reduc
-
distribute by: 根据指定字段分区 类似MR中partition,进行分区,结合sort by使用
注意,Hive要求DISTRIBUTE BY语句要写在SORT BY语句之前。需要提前设定reduce的个数,才能分区成功!
查看设置reduce个数 set mapreduce.job.reduces;
设置reduce个数 set.mapreduce.job.reduces=3;
- 先按照部门编号分区,再按照员工编号降序排序。
insert overwrite local directory '/opt/datas/distby-desc' select * from emp distribute by deptno sort by empno desc;
- cluster by: 分区且排序,其实它是sort by 和distribute by 的结合,当这两个by后边跟的字段是一样时,会使用cluster by 。它的排序方式默认是降序排序。
- 以下两种写法等价
select * from emp cluster by deptno;
select * from emp distribute by deptno sort by deptno desc;
注:mr shuffle过程中:有一个分区和排序--->shuffle 中先分区后排序,所以在使用distribute by 和sort by时,应该把distribute by 放在前面。
hive的多表关联
JOIN语句:
- 等值Join Hive支持通常的SQL JOIN语句,但是只支持等值连接,不支持非等值连接。
- 根据员工表和部门表中的部门编号相等,查询员工编号、员工名称和部门编号;
select e.empno, e.ename, d.deptno, d.dname from emp e join dept d on e.deptno = d.deptno;
-
内连接 只有进行连接的两个表中都存在与连接条件相匹配的数据才会被保留下来。
select e.empno, e.ename, d.deptno from emp e join dept d on e.deptno = d.deptno; -
左外连接 JOIN操作符左边表中符合WHERE子句的所有记录将会被返回。
select e.empno, e.ename, d.deptno from emp e left join dept d on e.deptno = d.deptno; -
右外连接 JOIN操作符右边表中符合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个连接条件。例如:连接三个表,至少需要两个连接条件。
SELECT e.ename, d.deptno, l. loc_name
FROM emp e
JOIN dept d
ON d.deptno = e.deptno
JOIN location l
ON d.loc = l.loc;
大多数情况下,Hive会对每对JOIN连接对象启动一个MapReduce任务。本例中会首先启动一个MapReduce job对表e和表d进行连接操作,然后会再启动一个MapReduce job将第一个MapReduce job的输出和表l;进行连接操作。
注意:为什么不是表d和表l先进行连接操作呢?这是因为Hive总是按照从左到右的顺序执行的。 -
笛卡尔积 JOIN
1)笛卡尔集会在下面条件下产生:
(1)省略连接条件
(2)连接条件无效
(3)所有表中的所有行互相连接
select empno, deptno from emp, dept;
FAILED: SemanticException Column deptno Found in more than One Tables/Subqueries