大数据开发八股文总结——Hive

什么是 Hive?

Hive 是由 Facebook 开源,基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文
件映射为一张表,并提供类 SQL 查询功能。

Hive 本质

Hive 是一个 Hadoop 客户端,用于将 HQL(Hive SQL)转化成 MapReduce 程序。
(1)Hive 中每张表的数据存储在 HDFS
(2)Hive 分析数据底层的实现是 MapReduce(也可配置为 Spark 或者 Tez)
(3)执行程序运行在 Yarn 上

Hive 架构原理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Hive安装部署(重要)

安装 Hive

1)把 apache-hive-3.1.3-bin.tar.gz 上传到 Linux 的/opt/software 目录下
2)解压 apache-hive-3.1.3-bin.tar.gz 到/opt/module/目录下面

[atguigu@hadoop102 software]$ tar -zxvf /opt/software/apache-hive-3.1.3-bin.tar.gz -C /opt/module/

3)修改 apache-hive-3.1.3-bin.tar.gz 的名称为 hive

[atguigu@hadoop102 software]$ mv /opt/module/apache-hive-3.1.3-bin/ /opt/module/hive

4)修改/etc/profile.d/my_env.sh,添加环境变量

[atguigu@hadoop102 software]$ sudo vim /etc/profile.d/my_env.sh
  • 添加内容
#HIVE_HOME
export HIVE_HOME=/opt/module/hive
export PATH=$PATH:$HIVE_HOME/bin
  • source 一下
[atguigu@hadoop102 hive]$ source /etc/profile.d/my_env.sh

5)初始化元数据库(默认是 derby 数据库)

[atguigu@hadoop102 hive]$ bin/schematool -dbType derby -initSchema

启动并使用 Hive

1)启动 Hive

[atguigu@hadoop102 hive]$ bin/hive

2)使用 Hive

hive> show databases;
hive> show tables;
hive> create table stu(id int, name string);
hive> insert into stu values(1,"ss");
hive> select * from stu;

观察 HDFS 的路径/user/hive/warehouse/stu,体会 Hive 与 Hadoop 之间的关系。
Hive 中的表在 Hadoop 中是目录;Hive 中的数据在 Hadoop 中是文件。
在这里插入图片描述
在这里插入图片描述
3)在 Xshell 窗口中开启另一个窗口开启 Hive,在/tmp/atguigu 目录下监控 hive.log 文件

[atguigu@hadoop102 atguigu]$ tail -f hive.log
Caused by: ERROR XSDB6: Another instance of Derby may have
already booted the database /opt/module/hive/metastore_db.
at
org.apache.derby.iapi.error.StandardException.newException(Unknow
n Source)
at
org.apache.derby.iapi.error.StandardException.newException(Unknow
n Source)
at
org.apache.derby.impl.store.raw.data.BaseDataFileFactory.privGetJ
BMSLockOnDB(Unknown Source)
at
org.apache.derby.impl.store.raw.data.BaseDataFileFactory.run(Unkn
own Source)
...

原因在于 Hive 默认使用的元数据库为 derby。derby 数据库的特点是同一时间只允许 一个客户端访问。如果多个 Hive 客户端同时访问,就会报错。由于在企业开发中,都是多人协作开发,需要多客户端同时访问 Hive,怎么解决呢?我们可以将 Hive 的元数据改为用MySQL 存储,MySQL 支持多客户端同时访问。
在这里插入图片描述
4)首先退出 hive 客户端。然后在 Hive 的安装目录下将 derby.log 和 metastore_db 删除,顺便将 HDFS 上目录删除

hive> quit;
[atguigu@hadoop102 hive]$ rm -rf derby.log metastore_db
[atguigu@hadoop102 hive]$ hadoop fs -rm -r /user

5)删除 HDFS 中/user/hive/warehouse/stu 中数据
在这里插入图片描述

安装MySQL

配置 Hive 元数据存储到 MySQL

在这里插入图片描述

DDL(Data Definition Language)数据定义

创建数据库

CREATE DATABASE [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];

案例:

(1)创建一个数据库,不指定路径

create database db_hive1;

(2)创建一个数据库,指定路径

create database db_hive2 location '/db_hive2';

(3)创建一个数据库,带有 dbproperties

create database db_hive3 with dbproperties('create_date'='2022-11-18');

查询数据库

展示所有数据库

语法:

SHOW DATABASES [LIKE 'identifier_with_wildcards'];

注:like 通配表达式说明:*表示任意个任意字符,|表示或的关系。

案例:

show databases like 'db_hive*';

OK
db_hive_1
db_hive_2

查看数据库信息

语法:

DESCRIBE DATABASE [EXTENDED] db_name;

案例:

(1)查看基本信息:

desc database db_hive3;

OK
db_hive hdfs://hadoop102:8020/user/hive/warehouse/db_hive.db atguigu USER

(2)查看更多信息:

desc database extended db_hive3;

OK
db_name comment location owner_name owner_type
parameters
db_hive3
hdfs://hadoop102:8020/user/hive/warehouse/db_hive3.db atguigu USER {create_date=2022-11-18}

修改数据库

用户可以使用 alter database 命令修改数据库某些信息,其中能够修改的信息包括
dbproperties、location、owner user。需要注意的是:修改数据库 location,不会改变当前已有表的路径信息,而只是改变后续创建的新表的默认的父目录。

语法:

--修改 dbproperties
ALTER DATABASE database_name SET DBPROPERTIES
(property_name=property_value, ...);
--修改 location
ALTER DATABASE database_name SET LOCATION hdfs_path;
--修改 owner user
ALTER DATABASE database_name SET OWNER USER user_name;

案例:

(1)修改 dbproperties

ALTER DATABASE db_hive3 SET DBPROPERTIES ('create_date'='2022-11-20');

删除数据库

语法:

DROP DATABASE [IF EXISTS] database_name [RESTRICT|CASCADE];

注:RESTRICT:严格模式,若数据库不为空,则会删除失败,默认为该模式。
CASCADE:级联模式,若数据库不为空,则会将库中的表一并删除。

案例:

(1)删除空数据库

drop database db_hive2;

(2)删除非空数据库

drop database db_hive3 cascade;

切换当前数据库

语法:

USE database_name;

表(table)

创建表

语法:

普通建表
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS]
[db_name.]table_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]
[TBLPROPERTIES (property_name=property_value, ...)]

关键字说明:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Create Table As Select(CTAS)建表

该语法允许用户利用 select 查询语句返回的结果,直接建表,表的结构和查询语句的
结构保持一致,且保证包含 select 查询语句放回的内容。

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table_name
[COMMENT table_comment]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)]
[AS select_statement]
Create Table Like 语法

该语法允许用户复刻一张已经存在的表结构,与上述的 CTAS 语法不同,该语法创建出
来的表中不包含数据。

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS]
[db_name.]table_name
[LIKE exist_table_name]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)]
案例

(1)内部表与外部表

Hive 中默认创建的表都是的内部表,有时也被称为管理表。

对于内部表,Hive 会完全管理表的元数据和数据文件。

外部表通常可用于处理其他工具上传的数据文件,对于外部表,Hive 只负责管理元数
据,不负责管理 HDFS 中的数据文件。

创建内部表如下:

create table if not exists student(
	id int,
	name string
)
row format delimited fields terminated by '\t'
location '/user/hive/warehouse/student';

准备其需要的文件如下,注意字段之间的分隔符。

[atguigu@hadoop102 datas]$ vim /opt/module/datas/student.txt
1001	student1
1002	student2
1003	student3
1004	student4
1005	student5
1006	student6
1007	student7
1008	student8
1009	student9
1010	student10
1011	student11
1012	student12
1013	student13
1014	student14
1015	student15
1016	student16

创建外部表如下:

create external table if not exists student(
	id int,
	name string
)
row format delimited fields terminated by '\t'
location '/user/hive/warehouse/student';

(2)SERDE 和复杂数据类型

本案例重点练习 SERDE 和复杂数据类型的使用。

若现有如下格式的 JSON 文件需要由 Hive 进行分析处理,请考虑如何设计表?
注:以下内容为格式化之后的结果,文件中每行数据为一个完整的 JSON 字符串

{
	"name": "dasongsong",
	"friends": [
		"bingbing",
		"lili"
	],
	"students": {
		"xiaohaihai": 18,
		"xiaoyangyang": 16
	},
	"address": {
		"street": "hui long guan",
		"city": "beijing",
		"postal_code": 10010
	}
}

我们可以考虑使用专门负责 JSON 文件的 JSON Serde,设计表字段时,表的字段与
JSON 字符串中的一级字段保持一致,对于具有嵌套结构的 JSON 字符串,考虑使用合适复杂数据类型保存其内容。
最终设计出的表结构如下:

create table teacher(
	name string,
	friends array<string>,
	students map<string, int>,
	address struct<city:string, street:string, postal_code:int>
)
row format serde 'org.apache.hadoop.hive.serde2.JsonSerDe'
location '/user/hive/warehouse/teacher';

创建该表,并准备以下文件。注意,需要确保文件中每行数据都是一个完整的 JSON
字符串,JSON SERDE 才能正确的处理。

(3)create table as select 和 create table like

create table as select:

create table teacher1 as select * from teacher;

create table like:

create table teacher2 like teacher;

DML(Data Manipulation Language)数据操作

Load 将文件导入到 Hive 表

Load 语句可将文件导入到 Hive 表中。

语法:

hive>
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE
tablename [PARTITION (partcol1=val1, partcol2=val2 ...)];

关键字说明:

(1)local:表示从本地加载数据到 Hive 表;否则从 HDFS 加载数据到 Hive 表。

(2)overwrite:表示覆盖表中已有数据,否则表示追加。

(3)partition:表示上传到指定分区,若目标是分区表,需指定分区。

实操案例:

(0)创建一张表

hive (default)>
create table student(
id int,
name string
)
row format delimited fields terminated by '\t';

(1)加载本地文件到 hive

hive (default)> load data local inpath
'/opt/module/datas/student.txt' into table student;

(2)加载 HDFS 文件到 hive 中

         ①上传文件到 HDFS

[atguigu@hadoop102 ~]$ hadoop fs -put /opt/module/datas/student.txt /user/atguigu

         ②加载 HDFS 上数据,导入完成后去 HDFS 上查看文件是否还存在

hive (default)>
load data inpath '/user/atguigu/student.txt'
into table student;

(3)加载数据覆盖表中已有的数据

         ①上传文件到 HDFS

hive (default)> dfs -put /opt/module/datas/student.txt
/user/atguigu;

         ②加载数据覆盖表中已有的数据

hive (default)>
load data inpath '/user/atguigu/student.txt'
overwrite into table student;

Insert

语法:

INSERT (INTO | OVERWRITE) TABLE tablename [PARTITION
(partcol1=val1, partcol2=val2 ...)] select_statement;

关键字说明:

(1)INTO:将结果追加到目标表

(2)OVERWRITE:用结果覆盖原有数据

Export&Import

Export 导出语句可将表的数据和元数据信息一并到处的 HDFS 路径,Import 可将 Export
导出的内容导入 Hive,表的数据和元数据信息都会恢复。Export 和 Import 可用于两个 Hive实例之间的数据迁移。

Hive 文件格式

为 Hive 表中的数据选择一个合适的文件格式,对提高查询性能的提高是十分有益的。
Hive 表数据的存储格式,可以选择 text file、orc、parquet、sequence file 等。

Text File

文本文件是 Hive 默认使用的文件格式,文本文件中的一行内容,就对应 Hive 表中的
一行记录。

可通过以下建表语句指定文件格式为文本文件:

create table textfile_table
(column_specs)
stored as textfile;

ORC(列式存储格式 重要)

ORC(Optimized Row Columnar)file format 是 Hive 0.11 版里引入的一种列式存储的文
件格式。ORC 文件能够提高 Hive 读写数据和处理数据的性能。

与列式存储相对的是行式存储,下图是两者的对比:
在这里插入图片描述
如图所示左边为逻辑表,右边第一个为行式存储,第二个为列式存储。

行存储的特点:

查询满足条件的一整行数据的时候,列存储则需要去每个聚集的字段找到对应的每个列的值,行存储只需要找到其中一个值,其余的值都在相邻地方,所以此时行存储查询的
速度更快

列存储的特点:

因为每个字段的数据聚集存储,在查询只需要少数几个字段的时候,能大大减少读取
的数据量;
每个字段的数据类型一定是相同的,列式存储可以针对性的设计更好的设计压缩算法。

前文提到的 text filesequence file 都是基于行存储的,orc parquet是基于列式存储的。

orc 文件的具体结构如下图所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Parquet

Parquet 文件是 Hadoop 生态中的一个通用的文件格式,它也是一个列式存储的文件格式。

Parquet 文件的格式如下图所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44123362/article/details/130257255