目录
- [1. 引言](#1. 引言)
-
- [1.1 启动Hive](#1.1 启动Hive)
- [1.2 docker-compose.yml更新](#1.2 docker-compose.yml更新)
- [2.配置Hive Tez引擎](#2.配置Hive Tez引擎)
-
- [2.1 下载并解压Tez](#2.1 下载并解压Tez)
- [2.3 上传Tez到HDFS](#2.3 上传Tez到HDFS)
- [2.4 复制tez的jar包到hive的lib下](#2.4 复制tez的jar包到hive的lib下)
- [2.5 配置Tez和Hive](#2.5 配置Tez和Hive)
-
- [2.5.1 tez-site.xml](#2.5.1 tez-site.xml)
- [2.5.2 hive-site.xml](#2.5.2 hive-site.xml)
- [2.6 处理Slf4j多重绑定](#2.6 处理Slf4j多重绑定)
- [3. 操作数据库](#3. 操作数据库)
- [4. 创建表](#4. 创建表)
- [5. 加载数据](#5. 加载数据)
- [6. Hive QL的高级操作(类似SQL操作)](#6. Hive QL的高级操作(类似SQL操作))
-
- [6.1 select](#6.1 select)
- [6.2 函数](#6.2 函数)
- [6.3 统计函数](#6.3 统计函数)
- [6.4 distinct去除重复值](#6.4 distinct去除重复值)
- [6.5 limit限制返回条数](#6.5 limit限制返回条数)
- [6.6 为列名取别名](#6.6 为列名取别名)
- [6.7 case when then多路分支](#6.7 case when then多路分支)
- [6.8 where查找](#6.8 where查找)
- [6.9 like模糊查询](#6.9 like模糊查询)
- [6.10 group by分组统计](#6.10 group by分组统计)
- [6.11 having过滤分组统计结果](#6.11 having过滤分组统计结果)
- [6.12 inner join内联接](#6.12 inner join内联接)
- [6.13 left outer join和right outer join外联接](#6.13 left outer join和right outer join外联接)
- [6.14 full outer join外部链接](#6.14 full outer join外部链接)
- [6.15 order by排序](#6.15 order by排序)
- 参考
1. 引言
Hive QL是Hive支持的类似SQL的查询语言。Hive QL可以分成DDL、DML和UDF。DDL可以创建数据库和表,进行数据库和表的删除;DML可以进行数据的添加、查询;UDF还支持用户自定义查询函数。
1.1 启动Hive
命令:
bash
start-dfs.sh && stop-dfs.sh
nohup hive --service metastore &
nohup hive --service hiveserver2 &
beeline -u "jdbc:hive2://172.18.0.2:10000" -n root
1.2 docker-compose.yml更新
由于Hive的默认引擎MapReduce在执行Hive QL时报错了,所以下面将配置Hive使用Tez引擎。
配置Tez引擎的hadoop3.3.6_ubuntu24.04镜像的tag更新为1.1,只需要删除原来的两个容器,再将Hive配置中第二节docker-compose.yml文件中hadoop服务的image改为mengsui/hadoop3.3.6_ubuntu24.04:1.1。
2.配置Hive Tez引擎
Hive的默认引擎是MapReduce,在未来的版本将会启用,并且查询效率不行。
2.1 下载并解压Tez
命令:
bash
cd ~
wget https://dlcdn.apache.org/tez/0.10.4/apache-tez-0.10.4-bin.tar.gz
tar -zxvf apache-tez-0.10.4-bin.tar.gz -C .
mv apache-tez-0.10.4-bin tez-0.10.4
2.3 上传Tez到HDFS
确保HDFS启动,输入命令:
bash
cd ~/tez-0.10.4/share
hadoop fs -mkdir /user/tez
hadoop fs -put tez.tar.gz /user/tez/tez.tar.gz
2.4 复制tez的jar包到hive的lib下
编辑复制脚本:
bash
cd ~
vim copy_tez_lib.sh
按i编辑,写入如下内容,按ESC输入:wq!保存,用bash copy_tez_lib.sh
运行。
bash
#!/bin/bash
tez_lib1=/root/tez-0.10.4
tez_lib2=/root/tez-0.10.4/lib
for jar in $(ls $tez_lib1 | grep jar); do
cp $tez_lib1/$jar $HIVE_HOME/lib/
done
for jar in $(ls $tez_lib2 | grep jar); do
cp $tez_lib2/$jar $HIVE_HOME/lib/
done
2.5 配置Tez和Hive
2.5.1 tez-site.xml
创建配置文件:
bash
cd ~/hadoop-3.3.6/etc/hadoop
cp ~/tez-0.10.4/conf/tez-default-template.xml tez-site.xml
用vim tez-site.xml
编辑配置文件,编辑tez.lib.uris。
编辑tez.history.logging.service.class,然后按ESC输入:wq!保存。
2.5.2 hive-site.xml
用cd ~/hive-4.0.1/conf && vim hive-site.xml
编辑hive-site.xml,编辑hive.execution.engine,然后按ESC输入:wq!保存。
2.6 处理Slf4j多重绑定
命令:
bash
cd ~/hive-4.0.1/lib
mkdir backup
mv log4j-slf4j-impl-2.18.0.jar backup/
mv slf4j-reload4j-1.7.36.jar backup/
3. 操作数据库
创建数据库:create database name;
。
查看数据库信息:describe database name;
或desc database name;
。
改变数据库:use name;
。
删除数据库:drop database name;
展示所有的数据库:show databases;
4. 创建表
创建表:
bash
create [external] table [if not exists] name
[(col_name data_type [comment col_comment], ...)]
[comment table_comment]
[partitioned by (col_name data_type [comment col_comment], ...)]
[clustered by (col_name, col_name, ...) [sorted by (col_name [asc|desc], ...)] into num_buckets buckets]
[row format row_format]
[stored as file_format]
[location hdfs_path]
external关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径location。Hive创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表则只删除元数据,不删除数据。
如果文件数据是纯文本,可以使用sorted as textfile。如果数据需要压缩,使用sorted as sequence。
有分区的表可以在创建时使用partitioned by语句。一个表可以拥有一个或者多个分区,每一个分区单独存在一个目录下。而且,表和分区都可以对某个列进行clustered by操作,将若干个列放入一个桶中。也可以利用sort by对数据进行排序。
create table emp (ename string, deptid int, degree int) row format delimited fields terminated by '|';
。
create table dept (deptid int, dname string) row format delimited fields terminated by '|';
。
展示所有表:show tables;
或show tables in database_name
。
查看表结构:describe database_name.table_name;
或desc database_name.table_name
;
5. 加载数据
加载数据:load data [local] inpath 'path' [overwrite] into table name;
。
local表示本机目录,不加则是HDFS上的目录。overwrite表示删除目标目录,没有则保留,但会覆盖同名旧目录。
进行两次load data local inpath '/root/hive-4.0.1/examples/files/dept.txt' into table dept;
后,通过select * from dept;
查看表,可以发现不带overwrite时数据重复写入了两次。
使用overwrite加载数据,可以发现之前的重复数据被删除了。
从其他表中追加导入数据:insert into table_name select * from table_name
。
先创建create table dept2 (deptid int, dname string) row format delimited fields terminated by '|';
,然后通过insert into dept2 select * from dept;
将dept的数据插入到dept2中。
select * from dept2;
insert into dept2 select * from dept;
,select * from dept2;
从其他表中覆盖式导入数据:insert overwrite table name select * from table_name;
insert overwrite table dept2 select * from dept;
,select * from dept2;
overwrite会删除原来的数据。
创建表的同时导入数据:create table name as select * from table_name;
create table dept3 as select * from dept2;
,select * from dept3;
导出数据:insert overwrite local directory 'path' select * from table_name;
insert overwrite local directory '/root/dept' select * from dept;

6. Hive QL的高级操作(类似SQL操作)
load data local inpath '/root/hive-4.0.1/examples/files/emp.txt' into table emp;
6.1 select
select:select *[/column_name,column_name,···] from table_name;
select ename,degree from emp;
6.2 函数
select upper(ename),deptid,degree from emp;
6.3 统计函数
select count(*),max(degree),min(degree),avg(degree),sum(degree) from emp;
6.4 distinct去除重复值
select distinct deptid from emp;
6.5 limit限制返回条数
select * from emp limit 3;
6.6 为列名取别名
select upper(ename) as empname,deptid as empdeptid from emp limit 3;
6.7 case when then多路分支
sql
select ename,case when degree < 3 then 'follower'
when degree > 5 then 'leader'
else 'middle'
end as newdegree from emp;
6.8 where查找
select * from emp where deptid=31;
6.9 like模糊查询
select * from emp where ename like '%o%';
%表示字母o前后可以是任意个字符。
6.10 group by分组统计
select deptid,avg(degree) from emp group by deptid;
6.11 having过滤分组统计结果
select deptid,avg(degree) from emp group by deptid having avg(degree)>3;
6.12 inner join内联接
select e.*,d.* from emp e join dept d on e.deptid=d.deptid;
6.13 left outer join和right outer join外联接
select e.*,d.* from emp e left outer join dept d on e.deptid=d.deptid;
left outer join显示左表全部数据,如果右表没有数据与之对应,则显示NULL。
select e.*,d.* from emp e right outer join dept d on e.deptid=d.deptid;
right outer join显示右表的全部数据,如果左表没有数据与之对应,则显示NULL。
6.14 full outer join外部链接
select e.*,d.* from emp e full outer join dept d on e.deptid=d.deptid;
full outer join显示左右表的全部数据,如果左表或者右表中没有对应数据,则显示NULL。
6.15 order by排序
select * from emp order by deptid [desc];
参考
吴章勇 杨强著 大数据Hadoop3.X分布式处理实战