实训笔记7.27
- 7.27笔记
- 一、Hive数据仓库基本概念(处理结构化数据)
- 1.1 Hive的组成架构
- 1.1.1 Hive的客户端
- 1.1.2 Hive的驱动程序
- 1.1.3 Hive的元数据库
- 1.2 Hive和数据库的区别
- 二、Hive的安装配置
- 三、Hive的相关配置项
- 四、Hive的基本使用方式
- 4.1 使用Hive的命令行客户端操作Hive
- 4.1.1 hive命令行的使用有三种方式
- 4.2 使用hiveserver2方法操作Hive
- 4.3 在Hive客户端中也可以直接操作HDFS和Linux的文件系统
- 五、Hive中HQL语法
- 5.1 DDL语法
- 5.1.1 数据库的管理语法
- 5.1.2 数据表的管理语法
- 5.2 DML语法
- 5.3 DQL语法
- 六、相关代码
7.27笔记
一、Hive数据仓库基本概念(处理结构化数据)
Hive数据仓库相当于是Hadoop的一个客户端,一个类SQL操作的客户端。Hive会使用数据库和数据表的形式进行结构化数据的存储,只不过Hive只提供库和表的结构,真实的表数据还是存放在HDFS上,Hive会使用一个叫做元数据库的概念将表数据和数据表进行关联。同时Hive也可以类SQL的查询语言对表数据进行统计分析,但是类SQL查询语言底层会被hive的驱动程序转换成为MapReduce程序在YARN上进行运行。
1.1 Hive的组成架构
1.1.1 Hive的客户端
Hive的客户端:HiveCli–hive的命令行 Java API等等 是用来编写HQL语言的媒介
1.1.2 Hive的驱动程序
Hive的驱动程序:解析器、编译器、优化器、执行器,四个驱动程序是将HQL语言转换成为MR、Spark、TEZ等分布式计算程序的核心。
1.1.3 Hive的元数据库
Hive的元数据库:hive的元数据库中存储了Hive中创建的数据库、数据表、表字段和字段类型以及表数据和数据表之间的映射关系。 Hive的元数据库不是在Hive中存放的,而是在一个关系型数据库derby、MySQL、SQL Server、Oracle等等中存放。默认情况下如果没有进行任何的配置,hive默认会在derby数据库存放元数据(hive-default.xml.templete默认文件配置的)
1.2 Hive和数据库的区别
虽然Hive使用了数据库类似的SQL语言,但是Hive和数据库完全不是一回事,只是Hive使用了数据库的相关思想简化了我们对海量数据的存储和计算操作。Hive底层的实现和数据库的实现完全不一样,Hive底层的实现还是基于大数据的分布式计算和分布式存储思想实现的,数据库的底层实现是数据库的相关原理性内容。
二、Hive的安装配置
-
上传Hive的安装包、解压缩、配置环境变量
-
解决Hive和其他软件的依赖冲突问题
-
Hive的日志框架依赖和Hadoop的框架依赖冲突,将hive的lib目录下的
log4j-slf4jxxxxx
-
Hive的guava的第三方依赖和Hadoop的依赖冲突了,将hive的guava依赖删除了,然后将Hadoop下的依赖复制到hive的lib目录下即可
-
-
在Hive中引入一个依赖文件–JDBC连接MySQL的驱动依赖—配置hive的元数据库到MySQL中
-
修改hive的相关配置文件
-
hive-env.sh
-
export HADOOP_HOME
-
export HIVE_CONF_DIR
之所以指定hive的配置文件目录,是因为hive默认提供的配置文件都是一个临时后缀名的文件,更像是一个hive的配置模块,Hive在默认情况下找不到配置文件目录
-
-
hive-log4j2.properties
- 配置了hive在运行中输出日志的保存目录
- 以后hive出现任何的问题(初始化元数据库、hive的HQL执行的问题),如果看不到具体的错误信息,在配置的日志保存目录下的hive.log文件中查看详细的出错信息
- 日志主要分为:DEBUG INFO,WARN ERROR
-
hive-site.xml(需要手动创建)
- 这个文件中主要配置hive的相关配置项,配置项默认在hive-default.xml.template文件中都存在,但是如果我们在hive-site.xml文件中配置了相同的配置项,会覆盖hive-default.xml同样的配置。
- hive-site.xml文件中第一行和第二行代码是xml文件的核心,如果第一行和第二行出现多余的空格或者少了字符,xml文件就不会解析或者解析失败
- 主要先配置了和元数据库有关的四项配置:URL(在xml中 &符合必须使用&标识)、Driver、Username、Password
-
-
使用hive之前,必须先初始化hive的元数据库,初始化只需要做一次,初始化元数据库和在hive-site.xml文件中配置的元数据库有关系的 schematool -initSchema -dbType mysql -verbos
配置Hive的时候,Hive底层需要MapReduce运行,但是hive的HQL语句转换的MR程序启动多少个map任务,多少个reduce任务都是不一定,因此如果转换的MR的任务书过多,而你的Hadoop集群的计算资源(CPU、内存不足)语法没问题,但是HQL语句执行会报错—报错资源不足:
xxxG of xxxG
使用Hive之前,最好在Hadoop的mapred-site.xml和yarn-site.xml文件中把资源调整一下
三、Hive的相关配置项
-
Hive的表数据在HDFS上存储目录的配置
Hive存储的表数据默认是在HDFS上存放的,默认存储到了HDFS的/user/hive/warehouse目录下
Hive安装好以后,默认会给我们提供一个default数据库。如果在hive中我们没有指定使用哪个数据库,那么hive会默认使用default数据库。default数据库中相关表数据都在/user/hive/warehouse路径下存放的 其他数据库的表数据会先在/user/hive/warehouse路径下创建一个xxx.db目录,然后再在这个目录下放对应数据库的表数据
hive的配置文件有一个配置项可以更改hive表数据的存储目录:
hive.metastore.warehouse.dir
默认配置的路径就是/user/hive/warehouse路径 -
Hive的HQL语句执行的时候可以转换成为MR程序、Spark程序、TEZ程序,默认情况下转换成为MR程序hive-default.xml.template中有一个配置项可以指定MR底层的转换规则:
hive.execution.engine mr
-
配置hive的数据库名和表头的显示
默认情况下,HiveCli-hive的命令行的客户端使用了某个数据库以后无法直观看到我们正在使用哪个数据库,包括查询表数据的时候,只会展示表数据,表字段不会展示。
<property> <name>hive.cli.print.header</name> <value>true</value> </property> <property> <name>hive.cli.print.current.db</name> <value>true</value> </property>
-
hive常用的客户端有两种
-
Hive的命令行客户端:hive命令 命令行客户端只能在hive安装的节点上使用
-
Hive的JDBC客户端操作
如果我们想在其他机器、节点上操作hive,hive命令行客户端就无法使用了,但是我们可以使用JDBC远程连接hive操作hive。但是如果使用jdbc连接hive,那么hive必须启动一个对应的服务hiveserver2,只有启动了这个服务,我们才能使用jdbc远程连接hive。
hivesever2是hive的远程连接服务,远程连接服务器会启动一个端口,通过端口可以进行通信远程操作Hive,在默认情况下,Hiveserver2没有配置的,我们需要自己配置并且启动。
-
配置hive-site.xml文件
-
配置Hadoop的core-site.xml文件 是因为hiveserver2启动之后,远程连接是需要用户名和密码的,远程连接的使用的用户名和密码默认是不能访问HDFS的。
-
启动hiveserver2:
nohup hiveserver2 1>/opt/app/hive-3.1.2/hive.log 2>&1 &
【注意】hiveserver2后端启动的时候,需要将日志输出到一个设置的指定文件中,日志文件赋予777的权限
-
JDBC连接操作Hive有三种方式
- 使用一种叫做beeline客户端连接hiveserver2服务进行操作,beeline是一种命令行工具,只不过命令行工具底层需要通过JDBC的方式去操作hive。beelinehive有集成的。我们可以单独安装
- 使用DBeaver连接hiveserver2进行操作,DBeaver连接相关数据库都是使用JDBC的方式进行连接
- 使用原生的Java代码去连接hiveserver2进行操作,七步曲
-
-
四、Hive的基本使用方式
4.1 使用Hive的命令行客户端操作Hive
好处:只需要启动了HDFS和YARN,就可以直接使用了,不需要启动任何的hive服务
缺点:只能在hive的安装节点上使用
4.1.1 hive命令行的使用有三种方式
-
hive
——————直接执行hive会进入hive的交互式命令行窗口,在窗口中写一行HQL语句,只要一敲回车执行一行HQL语句 -
hive -e "HQL语句"
——————不需要进入hive的交互式命令行也可以快速的执行hive的HQL语句,缺点只能执行一条 -
hive -f xxx.sql --hiveconf key=value --hivevar key=value
可以将需要执行的HQL语句封装到一个SQL文件当中,文件当中可以编写多条HQL语句,只需要每一条HQL语句以分号分割即可。
–hiveconf选项可以增加可以不增加,如果添加了 代表向sql文件传递一个参数,参数在SQL文件可以使用
${hiveconf:key}
获取参数的值–hivevar选项传递的参数需要通过
${hivevar:key}
如果传递多个参数,使用hiveconf传递:
hive -f xxx.sql --hiveconf key=value --hiveconf key=value
如果传递多个参数,使用hivevar传递:
hive -f xxx.sql --hivevar key=value --hivevar key=value
4.2 使用hiveserver2方法操作Hive
好处:可以在任何一台节点,通过JDBC的远程连接方式去远程操作Hive
缺点:因为远程连接需要通过网络传输数据,速度没有直接使用hive客户端快
4.3 在Hive客户端中也可以直接操作HDFS和Linux的文件系统
dfs 选项 HDFS路径
!命令
相关操作—Linux的相关操作
【注意】命令行客户端支持使用sql文件执行多个HQL命令,其中sql文件中可以添加注释,在Hive的SQL文件中 注释语言–空格 注释。 DBeaver中SQL编辑器中也是同样的道理,-- 注释
五、Hive中HQL语法
Hive中提供了类SQL语法进行数据的存储和计算操作,存储的数据也都是以表格和库的形式存在的。因此HQL语言和SQL语言有很多相似之处,但是也有很多的操作不一样的。
5.1 DDL语法
数据库和数据表的管理语法:创建、删除、修改、查询数据库和数据表的语法
5.1.1 数据库的管理语法
-
创建语法
create database [if not exists] database_name [comment "备注"] #给数据库加个介绍和备注 [location "hdfs路径"] #指定数据库的数据在HDFS上的存储位置,如果没有指定,那么默认存储到hdfs的/user/hive/warehouse/xxx.db [with dbproperties(key=value,key=value)]
-
修改语法
数据库不能改名字以及数据库在HDFS上的位置,但是可以修改数据库的dbproperties
属性值
alter database database_name set dbproperties('createtime'='20180830');
-
查看语法
show databases: #查看hive中有哪些数据库 show dataabases like '名字' #查询带有这个名字的数据库有哪些 desc database 数据库名; #查看数据库的简略信息 desc database extended 数据库名; #查看数据库的详细信息
-
使用语法
use 数据库名;
-
删除数据库语法
drop database database_name [cascade];
5.1.2 数据表的管理语法
-
创建数据表的语法
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name #external 外部的 [(col_name data_type [COMMENT col_comment], ...)] #表字段 [COMMENT table_comment] #表的备注 [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] #hive中特有的数据表 分区表 [CLUSTERED BY (col_name, col_name, ...) #hive中特有的数据表 分桶表 [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] #分桶表的信息 [ROW FORMAT row_format] #表字段之间的分隔符 [STORED AS file_format] #hdfs存储的文件的类型格式 默认是文本格式 [LOCATION hdfs_path] #单独指定数据表在hdfs上存储的目录,如果没有指定 那么就在表对应的数据库的路径下
-
Hive中有四种类型的表–一张数据表可能同时满足多个类型
-
管理表/内部表
create table table_name(.......)
管理表是Hive具备所有权限的一张表,如果把表删除了,那么表数据文件在HDFS上也会同步删除
-
外部表
create external table table_name(......)
hive对于外部表只具备查询和添加数据的操作,如果外部表删除,只是在hive中把表元数据信息删除了 表数据在hdfs还依然存在
在有些情况下,我们使用的数据不只只有hive在使用,spark flink可能都在使用这个数据,因此hive如果不使用这个数据了,把表删除了,但是数据是不能删除的,此时这样的表设置成为外部表。
-
分区表
create [external] table table_name(.......) comment "" partitioned by(分区字段 字段类型,第二个分区字段 字段类型) row format .......
分区表可以是管理表也可以是外部表,分区表和普通数据表不一样的地方在于,在HDFS存储数据的时候,非分区表是将数据以文件的形式直接存储到数据表所在目录下,而分区表会先在数据表所在目录下创建一个一个文件夹,然后再在文件夹里面放对应分区的数据,文件夹都是按照指定的数值进行操作的。
如果创建一个分区表,指定一个或者多个分区字段,分区字段的值有多个,那么在数据库表的目录下创建多个不同的文件夹存放不同分区的数据
分区表的目的是将表数据按照指定的规则分为不同的区域,这样的话以后我们在处理数据的时候可以按照指定的区域获得我们想要的数据。
分区表需要指定分区字段,分区字段一定不能是表字段
分区表增加数据的语法:
insert into table_name partition(分区字段=值) values(表字段值)
-
分桶表
create [external] table table_name(.......) comment "" partitioned by(分区字段 字段类型,第二个分区字段 字段类型) clustered by(分桶字段--一定表字段) [sorted by (排序字段 asc|desc)] into num buckets; row format .......
分桶表既可以是分区表,也可以是外部表,还可以是内部表。分桶表指的是将最终存储的结果文件存储为指定个数个文件,就相当于是MR程序在执行时,启动了多个reduceTask,每个reudceTask输出一个结果文件。
-
-
修改数据表的语法
-
修改表名
alter table table_name rename to new_table_name
-
修改/增加/替换列
alter table table_name change old_column new_column type
-
增加分区信息–不是增加分区字段,而是增加基于现有的分区字段增加一个新的目录
alter table table_name add partition(分区字段=分区值)
-
删除分区信息
alter table table_name drop partition(分区字段=分区值)
-
-
查看表的相关信息语法
show tables; #查看某一个数据库下的所有数据表 desc 表名 #查看某个表的字段、分区字段 desc formatted 表名 #查看某个表的详细信息 show partitions 表名 #查看某个表有多少个分区
5.2 DML语法
5.3 DQL语法
六、相关代码
-- 在hive客户端(命令行、JDBC方式的客户端)中执行HDFS的相关操作
dfs -ls /;
dfs -rm -r /demo;
-- 创建数据库的语法
create database if not exists demo01;--默认数据库数据存放到HDFS的/user/hive/warehouse路径下
create database if not exists demo02
comment "这是一个测试使用的专属数据库"
location "hdfs://192.168.35.101:9000/demo01" -- 路径我们一般不会指定 默认路径就挺好
with dbproperties("createtime"="2023-7-27","createuser"="zhipeng","name"="demo02");
-- 修改数据库的语法
ALTER database demo02 set dbproperties("createtime"="2023-7-26","tablenum"="3");
-- 查看demo02的数据库信息
desc database demo02;
-- 查看demo02的详细信息
desc database extended demo02;
-- 使用数据库
use demo02;
create table student(student_name string);
-- 删除数据库
drop database demo01; -- 这个命令只能删除空数据库 非空数据库无法使用该命令删除
drop database demo02 cascade; -- 删除非空数据库 把库下的数据表以及表数据一并删除了
-- 表的创建语法
use demo;
-- 1、管理表/内部表
create table if not exists demo(
username string comment "name",
password string comment "password"
)comment "this is manager table"
row format delimited fields terminated by "," lines TERMINATED BY "\n"
STORED AS TEXTFILE;
INSERT INTO demo values("zs","123456");
dfs -cat /user/hive/warehouse/demo.db/demo/000000_0;
-- 删除表
drop table demo;
-- 2、外部表
create external table if not exists demo(
username string comment "name",
password string comment "password"
)comment "this is external table"
row format delimited fields terminated by "," lines TERMINATED BY "\n"
STORED AS SEQUENCEFILE;
-- 3、创建一个管理分区表 学生表 按照学生的性别分区
create table if not exists student(
student_name string,
student_age int,
student_phone string
)partitioned by(student_sex string)
row format delimited fields terminated by ",";
insert into student partition(student_sex="woman") values("dnn",20,"13566666666");
dfs -cat /user/hive/warehouse/demo.db/student/student_sex=man/000000_0_copy_1;
select * from student where student_sex="man";
-- 4、创建一个多级分区表
create table if not exists student1(
student_name string,
student_age int,
student_phone string
)partitioned by(student_sex string,student_birthday string)
row format delimited fields terminated by ",";
insert into student1 partition(student_sex="man",student_birthday="2023-07")
values("qys",20,"1356666666");
-- 创建一个普通的分桶表教师表,要求按照教师的编号分为4个文件存储教师信息 每个文件中需要按照教师的年龄降序排序
create table if not exists teacher(
teacher_num string,
teacher_name string,
teacher_age int
)clustered by (teacher_num) sorted by(teacher_age desc) into 4 buckets;
insert into teacher values("t001","zs",30),
("t002","zs1",28),
("t003","zs2",27),
("t004","zs3",45),
("t005","zs4",50),
("t006","zs5",55),
("t007","zs6",46),
("t008","zs7",39),
("t009","zs8",52),
("t010","zs9",43);
dfs -cat /user/hive/warehouse/demo.db/teacher/000001_0;
-- 查看hive中所有配置项
set;
-- 分桶表的抽样查询 总共设置了4个桶 1 out of 2的意思 从第1个桶开始抽取4/2个桶的数据
select * from teacher tablesample(bucket 1 out of 8);
-- 按比例抽取时 如果抽取某一个数据块的大小小于128M 返回数据块的所有数据
select * from teacher tablesample(0.2 percent);
-- 修改表名
alter table teacher rename to teacher1;
alter table teacher1 change teacher_num teacher_number string;
alter table teacher1 add columns(teacher_phone string);
-- 增加分区
alter table student1 add partition(student_sex="woman",student_birthday="2023-08")
partition(student_sex="no",student_birthday="2023-08");
-- 删除分区 分区下的数据丢失了
alter table student1 drop partition(student_sex="man", student_birthday="2023-07");
--查看所有的数据表
show tables;
desc student1;
desc formatted student1;
show partitions student1;