Hive之从理论到实战(一)

第一章 Hive基本概念

1.1 什么是Hive

1.1.1 Hive简介

Hive:由Facebook开源用于解决海量结构化日志的数据统计工具。

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

我这种憨憨电脑就只能处理这么多数据了,再多要废了~~~~

image-20211210110558105

1.1.2 Hive本质

本质:将HQL转化成MapReduce程序

(1)Hive处理的数据存储HDFS

(2)Hive分析数据底层的实现MapReduce

(3)执行程序运行在Yarn上

1.1.3 和数据库的比较

由于 Hive 采用了类似SQL 的查询语言 HQL(Hive Query Language),因此很容易将 Hive 理解为数据库。**其实从结构上来看,Hive 和数据库除了拥有类似的查询语言,再无类似之处。**数据库可以用在 Online 的应用中,但是Hive 是为数据仓库而设计的,清楚这一点,有助于从应用角度理解 Hive 的特性。下面从多个方面比较二者:

查询语言

由于SQL被广泛的应用在数据仓库中,因此,专门针对Hive的特性设计了类SQL的查询语言HQL。熟悉SQL开发的开发者可以很方便的使用Hive进行开发。

数据更新

由于Hive是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。因此,Hive中不建议对数据的改写,所有的数据都是在加载的时候确定好的。而数据库中的数据通常是需要经常进行修改的,因此可以使用 INSERT INTO …  VALUES 添加数据,使用 UPDATE … SET修改数据。

执行延迟

Hive 在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高。另外一个导致 Hive 执行延迟高的因素是 MapReduce框架。由于MapReduce 本身具有较高的延迟,因此在利用MapReduce 执行Hive查询时,也会有较高的延迟。相对的,数据库的执行延迟较低。当然,这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive的并行计算显然能体现出优势。

数据规模

由于Hive建立在集群上并可以利用MapReduce进行并行计算,因此可以支持很大规模的数据;对应的,数据库可以支持的数据规模较小。

第二章 Hive数据类型

2.1 基本数据类型

Hive数据类型 Java数据类型 长度 例子
TINYINT byte 1byte有符号整数 20
SMALINT short 2byte有符号整数 20
INT int 4byte有符号整数 20
BIGINT long 8byte有符号整数 20
BOOLEAN boolean 布尔类型,true或者false TRUE FALSE
FLOAT float 单精度浮点数 3.14159
DOUBLE double 双精度浮点数 3.14159
STRING string 字符系列。可以指定字符集。可以使用单引号或者双引号。 ‘now is the time’ “for all good men”
TIMESTAMP 时间类型
BINARY 字节数组
对于Hive的String类型相当于数据库的varchar类型,该类型是一个可变的字符串,不过它不能声明其中最多能存储多少个字符,理论上它可以存储2GB的字符数。

2.2 集合数据类型

数据类型 描述 语法示例
STRUCT 和c语言中的struct类似,都可以通过“点”符号访问元素内容。例如,如果某个列的数据类型是STRUCT{first STRING, last STRING},那么第1个元素可以通过字段.first来引用。 struct()例如struct<street:string, city:string>
MAP MAP是一组键-值对元组集合,使用数组表示法可以访问数据。例如,如果某个列的数据类型是MAP,其中键->值对是’first’->’John’和’last’->’Doe’,那么可以通过字段名[‘last’]获取最后一个元素 map()例如map<string, int>
ARRAY 数组是一组具有相同类型和名称的变量的集合。这些变量称为数组的元素,每个数组元素都有一个编号,编号从零开始。例如,数组值为[‘John’, ‘Doe’],那么第2个元素可以通过数组名[1]进行引用。 Array()例如array
Hive有三种复杂数据类型ARRAY、MAP 和 STRUCT。ARRAY和MAP与Java中的Array和Map类似,而STRUCT与C语言中的Struct类似,它封装了一个命名字段集合,复杂数据类型允许任意层次的嵌套。

2.2.3 类型转化

Hive的原子数据类型是可以进行隐式转换的,类似于Java的类型转换,例如某表达式使用INT类型,TINYINT会自动转换为INT类型,但是Hive不会进行反向转化,例如,某表达式使用TINYINT类型,INT不会自动转换为TINYINT类型,它会返回错误,除非使用CAST操作。

大可隐式转小,小不可隐式转大

转换规则

(1)任何整数类型都可以隐式地转换为一个范围更广的类型,如TINYINT可以转换成INT,INT可以转换成BIGINT。
(2)所有整数类型、FLOAT和STRING类型都可以隐式地转换成DOUBLE。(String类型转换的前提是阿拉伯数字)
(3)TINYINT、SMALLINT、INT都可以转换为FLOAT。
(4)BOOLEAN类型不可以转换为任何其它的类型。

使用CAST显式数据类型转换

例如CAST('1' AS INT)将把字符串'1' 转换成整数1;如果强制类型转换失败,如执行CAST('X' AS INT),表达式返回空值 NULL。

第三章 DDL数据

3.1 对库

3.1.1 创建数据库

语法:

CREATE DATABASE [IF NOT EXISTS] database_name
[COMMENT database_comment]              #数据库的说明
[LOCATION hdfs_path]					#存储在HDFS的路径
[WITH DBPROPERTIES (property_name=property_value, ...)];  #数据库相关配置项

3.1.2 查询数据库

1) 显示数据库

show databases;
  1. 过滤显示查询的数据库
show databases like 'db_hive*';
  1. 查看数据库详情
desc database [extended] db_hive;         #extended 显示详细信息

4) 切换当前数据库

use 库名;

3.1.3 删除数据库

  1. 删除空数据库
drop [if not exists] database 库名;
  1. 如果数据库不为空,可以采用cascade(级联)命令强制删除
drop database 库名 cascade;

3.2对表

3.2.1 创建表

语法:

语法很长,根据需要使用就好了,我们简单的创建表的话其实还是很简单的,不信我们看一下下面的案例~~~

create [external] table [if not exists] 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, ...)] //
[AS select_statement]

字段解释说明

1CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项来忽略这个异常。
(2)EXTERNAL关键字可以让用户创建一个外部表,在建表的同时可以指定一个指向实际数据的路径(LOCATION),在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
(3COMMENT:为表和列添加注释。
(4)PARTITIONED BY创建分区表
(5CLUSTERED BY创建分桶表
(6)SORTED BY不常用,对桶中的一个或多个列另外排序
(7ROW FORMAT 
DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char]
        [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char] 
   | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]
   用户在建表的时候可以自定义SerDe(Serialize/Deserilize)或者使用自带的SerDe。如果没有指定ROW FORMAT 或者ROW FORMAT DELIMITED,将会使用自带的SerDe。在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的SerDe,Hive通过SerDe确定表的具体的列的数据。
(8)STORED AS指定存储文件类型
常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列式存储格式文件)
如果文件数据是纯文本,可以使用STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE。
(9)LOCATION :指定表在HDFS上的存储位置。
(10AS:后跟查询语句,根据查询结果创建表。
(11LIKE允许用户复制现有的表结构,但是不复制数据。

案例

创建部门表
create external table if not exists dept(
deptno int,
dname string,
loc int
)
row format delimited fields terminated by 't';

简简单单朴实无华,小白就该有小白的亚子!

3.2.2 管理表(内部表)

默认创建的表都是所谓的管理表,有时也被称为内部表。因为这种表,Hive会(或多或少地)控制着数据的生命周期。Hive默认情况下会将这些表的数据存储在由配置项hive.metastore.warehouse.dir(例如,/user/hive/warehouse)所定义的目录的子目录下。	当我们删除一个管理表时,Hive也会删除这个表中数据。管理表不适合和其他工具共享数据。

3.2.3 外部表

因为表是外部表,所以Hive并非认为其完全拥有这份数据。删除该表并不会删除掉这份数据,不过描述表的元数据信息会被删除掉。

两种表的应用场景

每天将收集到的网站日志定期流入HDFS文本文件。在外部表(原始日志表)的基础上做大量的统计分析,用到的中间表、结果表使用内部表存储,数据通过SELECT+INSERT进入内部表。

管理表到外部表的转换

alter table table_name set tblproperties('EXTERNAL'='TRUE');
显然外部表到内部表那么参数就是false

3.2.4 修改表

重命名表

ALTER TABLE table_name RENAME TO new_table_name;

3.2.5 增加/修改/替换列信息

(1)更新列

ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name]

(2)增加和替换列

ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...) 

注:ADD是代表新增一字段,字段位置在所有列后面(partition列前)REPLACE则是表示替换表中所有字段。

第四章 DML

4.1 数据导入

4.1.1 向表中装载数据(Load)

语法:

load data [local] inpath '数据的path' [overwrite] into table student [partition (partcol1=val1,)];

说明:

(1)load data:表示加载数据

(2)local:表示从本地加载数据到hive表;否则从HDFS加载数据到hive表

(3)inpath:表示加载数据的路径

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

(5)into table:表示加载到哪张表

(6)student:表示具体的表

(7)partition:表示上传到指定分区

4.1.2 通过查询语句向表中插入数据(Insert)

基本模式插入

insert overwrite table student_par select id, name from student ; 

4.1.3查询语句中创建表并加载数据(As Select)

根据查询结果创建表(查询的结果会添加到新创建的表中)

create table if not exists student3
as select id, name from student;

4.1.4 创建表时通过Location指定加载数据路径

4.1.5 Import数据到指定Hive表中

注意:先用export导出后,再将数据导入。

4.2 数据导出

4.2.1 Insert导出

1)将查询的结果导出到本地

hive (default)> insert overwrite local directory '/opt/module/hive/datas/export/student'
select * from student;

2)将查询的结果格式化导出到本地

hive(default)>insert overwrite local directory '/opt/module/hive/datas/export/student1'
ROW FORMAT DELIMITED FIELDS TERMINATED BY 't'       
select * from student;

3)将查询的结果导出到HDFS上(没有local)

hive (default)> insert overwrite directory '/user/atguigu/student2'
ROW FORMAT DELIMITED FIELDS TERMINATED BY 't' 
select * from student;

4.2.2 Hadoop命令导出到本地

hive (default)> dfs -get /user/hive/warehouse/student/student.txt
/opt/module/datas/export/student3.txt;

Export导出到HDFS上

(defahiveult)> export table default.student to
 '/user/hive/warehouse/export/student';

Sqoop导出

后面学,暂时没学

4.3 清除表中数据 (Truncate)

注意:Truncate只能删除管理表,不能删除外部表中数据

hive (default)> truncate table student;
default)> dfs -get /user/hive/warehouse/student/student.txt
/opt/module/datas/export/student3.txt;

预告

第5章 查询
第6章 分区表和分桶表
第7章 函数
第8章 企业级调优
第9章 Hive实战

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>