✅作者简介:最近接触到大数据方向的程序员,刚入行的小白一枚
作者博客主页:皮皮皮皮皮皮皮卡乒的博客
当前专栏:Hive学习进阶之旅
研究方向:大数据方向,数据汇聚,数据治理
上一篇博文:数据导入和数据导出
查询语法
[WITH CommonTableExpression (, CommonTableExpression)*] (Note: Only available starting with Hive 0.13.0)
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[ORDER BY col_list]
[CLUSTER BY col_list
| [DISTRIBUTE BY col_list] [SORT BY col_list]
]
[LIMIT [offset,] rows]
LIMIT官方文档:
DISTINCT官方文档:
select *
from emp
where sal between 500 and 1000;
select *
from emp
where sal
IN (1500, 5000);
eg:计算 emp 表每个部门的平均工资
select t.deptno, avg(t.sal) avg_sal
from emp t
group by t.deptno;
eg1:查找名字以 A 开头的员工信息
select *
from emp
where ename LIKE 'A%';
eg2:查找名字中第二个字母为 A 的员工信息
select *
from emp
where ename LIKE '_A%';
eg3:查找名字中带有 A 的员工信息
select *
from emp
where ename RLIKE '[A]';
说明:
以下查询是基于两张表实现的,一张是员工表:员工姓名,员工编号,员工部门编号;一张是部门表:部门编号,部门名称,使用部门编号来连接两张表
分别依次实现:左外,右外、左外除去公共部分,右外除去公共部分、满外连接、两张表除公共部分
select e.empno, e.ename, d.deptno
from emp e
left join dept d
on e.deptno = d.deptno;
select e.empno, e.ename, d.deptno
from emp e
right join dept d
on e.deptno = d.deptno;
select e.empno,e.ename,e.deptno,d.dname
from emp e
left join dept d
on e.deptno = d.deptno
where d.deptno is null;
select e.empno,e.ename,e.deptno,d.dname
from emp e
right join dept d
on e.deptno = d.deptno
where d.deptno is null;
select e.empno,e.ename,nvl(e.deptno,d.deptno),d.dname
from emp e
full join dept d
on e.deptno = d.deptno;
select e.empno,e.ename,e.deptno,d.deptno,d.dname
from emp e
full join dept d
on e.deptno = d.deptno
where e.deptno is null or d.deptno is null;
Order By:全局排序,只有一个 Reducer
Sort By:对于大规模的数据集 order by 的效率非常低。在很多情况下,并不需要全局排序,此时可以使用 sort by。
Sort by 为每个 reducer 产生一个排序文件。每个 Reducer 内部进行排序,对全局结果集 来说不是排序。通常结合Order By使用
Distribute By: 在有些情况下,我们需要控制某个特定行应该到哪个 reducer,通常是为 了进行后续的聚集操作。 distribute by 子句可以做这件事。distribute by 类似 MR 中 partition (自定义分区) ,进行分区,结合 sort by 使用。
对于 distribute by 进行测试,一定要分配多 reduce 进行处理, 否则无法看到 distribute by 的效果。
对每个部门的员工,按照部门编号进行排序展示:
select *
from emp
distribute by deptno
sort by empno desc;
分区表实际上就是对应一个 HDFS 文件系统上的独立的文件夹, 该文件夹下是该分区所 有的数据文件。Hive 中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据 集。在查询时通过 WHERE 子句中的表达式选择查询所需要的指定的分区,这样的查询效率 会提高很多。
创建分区表:
create table dept_partition(
deptno int, dname string, loc string
)
partitioned by (day string)
row format delimited fields terminated by '\t';
创建二级分区(将分区在进行细分):
create table dept_partition2(
deptno int, dname string, loc string )
partitioned by (day string, hour string)
row format delimited fields terminated by '\t';
分区字段在:partitioned by后面出现
区分区表加载数据:
将数据添加到三个分区
load data local inpath
'/opt/module/hive/datas/dept_20200401.log'
into table dept_partition
partition(day='20200401');
load data local inpath
'/opt/module/hive/datas/dept_20200402.log'
into table dept_partition
partition(day='20200402');
load data local inpath
'/opt/module/hive/datas/dept_20200403.log'
into table dept_partition
partition(day='20200403');
查询分区数据:
select *
from dept_partition
where day='20200401';
分区操作:
分区修复的原因:
把数据直接上传到分区目录上,让分区表和数据没有产生关联,也就是说没有元数据,对应表和实际存放数据的映射