Hive3.1.2概述与基本操作

1、Hive基本概念

1.1.1 Hive简介

面试题:什么是hive?
1、hive是数据仓库建模的工具之一。
2、可以向hive传入一条交互式的sql,在海量数据中查询分析得到结果的平台。

1.1.2 为什么使用Hive?

直接使用hadoop的话,人员学习成本太高,项目要求周期太短,MapReduce实现复杂查询逻辑开发难度太大。如果使用hive的话,可以操作接口采用类SQL语法,提高开发能力,免去了写MapReduce,减少开发人员学习成本,功能扩展很方便(比如:开窗函数)。

1.1.3 Hive的特点:

1、可扩展性

Hive可以自由的扩展集群的规模,一般情况下不需要重启服务

2、延申性

Hive支持自定义函数,用户可以根据自己的需求来实现自己的函数

3、容错

即使节点出现错误,SQL仍然可以完成执行

1.1.4 Hive的优缺点:

优点:

1、操作接口采用类sql语法,提供快速开发的能力

2、避免了去写MapReduce,减少开发人员的学习成本

3、Hive的延迟性比较高,因此Hive常用于数据分析,适用于对实时性要求不高的场合

4、Hive 优势在于处理大数据,对于处理小数据没有优势,因为 Hive 的执行延迟比较高。(不断地开关JVM虚拟机)

5、Hive 支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。

6、集群可自由扩展并且具有良好的容错性,节点出现问题SQL仍可以完成执行

缺点:

1、Hive的HQL表达能力有限

(1)迭代式算法无法表达 (反复调用,mr之间独立,只有一个map一个reduce,反复开关)

(2)数据挖掘方面不擅长

2、Hive 的效率比较低

(1)Hive 自动生成的 MapReduce 作业,不够智能化

(2)Hive 调优比较困难,不能像编写mapreduce一样精细,无法控制在map处理数据还是在reduce处理数据)

1.1.5 Hive和传统数据库对比

严格来说无法进行比较,hive是数据仓库建模的工具之一,并不是数据库。

1.1.6 Hive应用场景

日志分析:大部分互联网公司使用hive进行日志分析,如百度、淘宝等。

统计一个网站一个时间段内的pv,uv,SKU,SPU,SKC

多维度数据分析(数据仓库

构建数据仓库

PV(Page View)访问量, 即页面浏览量或点击量,访问数据的次数,UV(Unique Visitor)独立访客,访问用户的个数。

1.2 Hive架构

image-20220531214038409

1.2.1 Client

Hive允许client连接的方式有三个CLI(hive shell)、JDBC/ODBC(java访问hive)、WEBUI(浏览器访问 hive)。

1)client–需要下载安装包

2)JDBC/ODBC 也可以连接到Hive,用的比较多的是第二种 Hive Server2/beeline。

服务端启动hiveserver2服务:
nohup hive --service metastore &
nohup hiveserver2 &

1.2.2  Metastore

元数据包括表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型、表的数据所在目录等,主要用于存放数据库的建表语句等信息 ,推荐使用Mysql数据库存放数据。

1.2.3  Driver (sql语句是如何转化成MR任务的?)

1) 解析器(SQL Parser):将SQL字符串转换成抽象语法树AST(从3.x版本之后,转换成一些stage),对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。

2) 编译器(Physical Plan):将AST编译生成逻辑执行计划。

3) 优化器(Query Optimizer):对逻辑执行计划进行优化。

4) 执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是 MR/Spark/flink。

1.2.4  数据处理

Hive的数据存储在HDFS中,计算由MapReduce完成。解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。

1.4  Hive的三种交互方式

1)第一种交互方式

shell交互Hive,用命令hive启动一个hive的shell命令行,在命令行中输入sql或者命令来和Hive交互。

服务端启动metastore服务(后台启动):nohup hive --service metastore &
进入命令:hive
退出命令行:quit;

2)第二种交互方式

Hive 启动服务器 ,其他机器可以通过客户端通过协议连接到服务器,来完成访问操作

服务端启动hiveserver2服务:
nohup hive --service metastore &
nohup hiveserver2 &

需要稍等一下,启动服务需要时间:
进入命令:1)先执行: beeline ,再执行: !connect jdbc:hive2://master:10000 
               2)或者直接执行:  beeline -u jdbc:hive2://master:10000 -n root
退出命令行:!exit

3) 第三种交互方式

使用 –e 参数来直接执行hql的语句

bin/hive -e "show databases;"

vim hive.sql

create database bigdata30_test;
use bigdata30_test;

create table test1
(
    id bigint,
    name string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

show tables;

hive -f hive.sql

1.5  Hive元数据

Hive元数据库中的一些重要的表结构及用途,方便SparkSQL、Hive等组件访问元数据库。

1、Hive数据库相关的元数据表(DBS、DATABASE_PARAMS)

DBS:该表存储Hive中所有数据库的基本信息。

DATABASE_PARAMS:该表存储数据库的相关参数。

2、 Hive表和视图相关的元数据表

TBLS:该表中存储Hive表,视图,索引表的基本信息。 ​

TABLE_PARAMS:该表存储表/视图的属性信息。

3、 Hive文件存储信息相关的元数据表

SDS: 该表保存文件存储的基本信息,如INPUT_FORMAT、OUTPUT_FORMAT、是否压缩等。

SD_PARAMS: 该表存储Hive存储的属性信息。

SERDES:该表存储序列化使用的类信息。

SERDE_PARAMS:该表存储序列化的一些属性、格式信息,比如:行、列分隔符。

2、Hive的基本操作

2.1 Hive库操作

2.1.1 创建数据库

1)创建一个数据库  create database testdb(库名);

2)避免要创建的数据库已经存在错误,增加if not exists判断。

create database testdb(库名);

2.2.2 创建数据库和位置

create database if not exists bigdata30_test location '/bigdata30/xxxdb';

2.2.3 修改数据库

数据库的其他元数据信息都是不可更改的,包括数据库名和数据库所在的目录位置。

alter database dept set dbproperties('createtime'='20240610');

2.2.4  数据库详细信息

1)显示数据库(show)

show databases;

2)可以通过like进行过滤

show databases like 't*';

3)查看详情(desc)

desc database testdb;

4)切换数据库(use)

use bigdata30;

2.2.5 删除数据库

1)删除数据库最简写法

drop database testdb;

2)如果删除的数据库不存在,最好使用if exists判断数据库是否存在。否则会报错:FAILED: SemanticException [Error 10072]: Database does not exist: db_hive

drop database if exists testdb;

3)如果数据库不为空,使用cascade命令进行强制删除。

drop database if exists testdb cascade;

2.2 Hive数据类型

2.2.1 基础数据类型
类型Java数据类型描述
BIGINTlong64位有符号整型。取值范围:-2 63 +1~2 63 -1。
DOUBLEdoubledouble
STRINGstring字符串类型,目前长度限制为8MB。
TINYINTbyte8位有符号整型。取值范围:-128~127。
SMALLINTshort16位有符号整型。取值范围:-32768~32767。
INTint32位有符号整型。取值范围:-2 31 ~2 31 -1。
BINARY二进制数据类型,目前长度限制为8MB。
FLOATfloat32位二进制浮点型。
DECIMAL(precision,scale)10进制精确数字类型。precision:表示最多可以表示多少位的数字。取值范围:1 <= precision <= 38。scale:表示小数部分的位数。取值范围: 0 <= scale <= 38。如果不指定以上两个参数,则默认为decimal(10,0)。
VARCHAR(n)变长字符类型,n为长度。取值范围:1~65535。
CHAR(n)固定长度字符类型,n为长度。最大取值255。长度不足则会填充空格,但空格不参与比较。
DATE日期类型,格式为yyyy-mm-dd。取值范围:0000-01-01~9999-12-31。
DATETIME日期时间类型。取值范围:0000-01-01 00:00:00.000~9999-12-31 23.59:59.999,精确到毫秒。
TIMESTAMP与时区无关的时间戳类型
BOOLEANbooleanBOOLEAN类型。取值:True、False。

2.2.2   复杂数据类型

类型定义方法构造方法
ARRAYarray<int>``array<struct<a:int, b:string>>array(1, 2, 3) ;array(array(1, 2), array(3, 4))
MAPmap<string, string>``map<smallint, array<string>>map(“k1”, “v1”, “k2”, “v2”)  ;map(1S, array(‘a', ‘b’), 2S, array(‘x’, ‘y’))
STRUCTstruct<x:int, y:int> , struct<field1:bigint, field2:array<int>, named_struct(‘x’, 1, ‘y’, 2)

数组:array< 所有类型 >;

​Map < 基本数据类型,所有数据类型 >; ​

struct < 名:所有类型[注释] >;

​uniontype< 所有类型,所有类型… >

2.3  Hive表操作

Hive的存储格式:

TEXTFILE 即正常的文本格式,是Hive默认文件存储格式,因为大多数情况下源数据文件都是以text文件格式保存(便于查看验数和防止乱码)。这种格式的表文件在HDFS上是明文,可用hadoop fs -cat命令查看,从HDFS上get下来后也可以直接读取。

ORCFile:ORC文件不仅仅是一种列式文件存储格式,最重要的是有着很高的压缩比,并且对于MapReduce来说是可切分(Split)的,所以在hive中使用orc作为表的文件存储格式,不仅很大程度的节省HDFS存储资源,而且对数据的查询和处理性能有非常大的提升。

RCFile:是Hadoop中第一个列文件格式。能够很好的压缩和快速的查询性能。通常写操作比较慢,比非列形式的文件格式需要更多的内存空间和计算量。ORC能很大程度的节省存储和计算资源,在读写时候需要消耗额外的CPU资源来压缩和解压缩,但这部分的CPU消耗是非常少的。

Parquet:parquet的灵感来自于2010年Google发表的Dremel论文,文中介绍了一种支持嵌套结构的存储格式,并且使用了列式存储的方式提升查询性能。Parquet仅仅是一种存储格式,它是语言、与平台无关,并且不需要和任何一种数据处理框架绑定。这也是parquet相较于orc的仅有优势:支持嵌套结构。不支持update操作(数据写成后不可修改),不支持ACID等。

SEQUENCEFile:SequenceFile是Hadoop API 提供的一种二进制文件,它将数据以<key,value>的形式序列化到文件中。这种二进制文件内部使用Hadoop 的标准的Writable 接口实现序列化和反序列化。它与Hadoop API中的MapFile 是互相兼容的。

AVRO:Avro是一种用于支持数据密集型的二进制文件格式。它的文件格式更为紧凑,若要读取大量数据时,Avro能够提供更好的序列化和反序列化性能。

image-20220531234553385

结论:ORCFile存储文件读操作效率最高

耗时比较:ORC<Parquet<RC<Text

image-20220531234659264

结论:ORCFile存储文件占用空间少,压缩效率高

占用空间:ORC<Parquet<RC<Text

2.3.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]


字段解释说明:
- CREATE TABLE 
    创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项来忽略这个异常。

- EXTERNAL
    关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION)
    创建内部表时,会将数据移动到数据仓库指向的路径(默认位置);
    创建外部表时,仅记录数据所在的路径,不对数据的位置做任何改变。在
    删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。

- COMMENT:
    为表和列添加注释。

- PARTITIONED BY
    创建分区表

- CLUSTERED BY
    创建分桶表

- SORTED BY
    不常用

- STORED AS指定存储文件类型
    常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE (列式存储格式文件)
    如果文件数据是纯文本,可以使用STORED AS TEXTFILE。
    如果数据需要压缩,使用 STORED AS SEQUENCEFILE。

- LOCATION :
    指定表在HDFS上的存储位置。

- LIKE

允许用户复制现有的表结构,但是不复制数据。

建表1:全部使用默认建表方式
create table students
(
    id bigint,
    name string,
    age int,
    gender string,
    clazz string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '_'; // 必选,指定列分隔符 
建表2:指定location (这种方式也比较常用)
create table IF NOT EXISTS students2
(
    id bigint,
    name string,
    age int,
    gender string,
    clazz string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/bigdata30/input1';// 指定Hive表的数据的存储位置,一般在数据已经上传到hdfs
建表3:指定存储格式
create table IF NOT EXISTS testdb
(
    id bigint,
    name string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS ORC
LOCATION '/bigdata30/zheli'; // 指定储存格式为orcfile,inputFormat:RCFileInputFormat,outputFormat:RCFileOutputFormat,如果不指定,默认为textfile,注意:除textfile以外,其他的存储格式的数据都不能直接加载。
建表4:create table xxxx like table_name只想建表,不需要加载数据
create table students3 like students;

复杂人员信息表创建

create table IF NOT EXISTS person(
name string,
friends array<string>,
children map<string,int>,
address struct<street:string ,city:string>
)
row format delimited fields terminated by ',' -- 列与列之间的分隔符
collection items terminated by '_' -- 元素与元素之间分隔符
map keys terminated by ':' -- Map数据类型键与值之间的分隔符
lines terminated by '\n';  -- 行与行之间的换行符

zhangsan,lisi_wangwu,zhangsan:18_lisi:19,he fei_anhui

2.3.2  显示表
show tables;
show tables like 'u*';
desc person(表名);//查看表详细信息
desc formatted students; // 更加详细
2.3.3 加载数据

1、使用hdfs dfs -put '本地数据' 'hive表对应的HDFS目录下'

2、使用 load data

下列命令需要在hive shell里执行

create table IF NOT EXISTS students4
(
    id bigint,
    name string,
    age int,
    gender string,
    clazz string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

// 将HDFS上的/xxx目录下面的数据 移动至 students表对应的HDFS目录下,注意是移动
load data inpath '/input1/students.txt' into table students;
// 清空表
truncate table students;
// 加上 local 关键字 可以将Linux本地目录下的文件 上传到 hive表对应HDFS 目录下 原文件不会被删除
load data local inpath '/usr/local/soft/data/students.txt' into table students;
// overwrite 覆盖加载
load data local inpath '/usr/local/soft/data/students.txt' overwrite into table students;

// 将 students表的数据插入到students2 
insert into table students2 select * from students;
// 覆盖插入 把into 换成 overwrite
insert overwrite table students2 select * from students;
2.3.4  修改列
> 查询表结构

desc students;

> 添加列

alter table students2 add columns (education string);

> 查询表结构

desc students(表名);

> 更新列

alter table 表名 change education educationnew string;

2.3.5  删除表
drop table students;

2.4  Hive内外部表

面试题:内部表和外部表的区别?

内部表一删全删,hive表,MySQL中元数据,hdfs数据都不存在了,外部表删除hive表,数据仍然保存在hdfs中,不会删除。外部表在table前加上external,内部表不需要。

2.4.1 hive内部表

创建好表的时候,HDFS会在当前表所属的库中创建一个文件夹

当设置表路径的时候,如果直接指向一个已有的路径,可以直接去使用文件夹中的数据

当load数据的时候,就会将数据文件存放到表对应的文件夹中

而且数据一旦被load,就不能被修改

我们查询数据也是查询文件中的文件,这些数据最终都会存放到HDFS

当我们删除表的时候,表对应的文件夹会被删除,同时数据也会被删除

默认建表的类型就是内部表

create table students_internal
(
    id bigint,
    name string,
    age int,
    gender string,
    clazz string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/input2';

hive> dfs -put /usr/local/soft/data/students.txt /input2/;
2.4.1  hive外部表

外部表因为是指定其他的hdfs路径的数据加载到表中,所以hive不完全独占这份数据

删除hive表的时候,数据仍然保存在hdfs中,不会删除。

create external table students_external
(
    id bigint,
    name string,
    age int,
    gender string,
    clazz string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/input3';

hive> dfs -put /usr/local/soft/data/students.txt /input3/;

2.5  Hive导出数据

将表中数据备份

2.5.1  将查询结果存放到本地

//导出查询结果的数据(导出到Node01上)
insert overwrite local directory '/usr/local/soft/bigdata30/hive_out1/person_data' select * from t_person;


insert overwrite local directory '/usr/local/soft/bigdata30/hive_out1/stu1' 
ROW FORMAT DELIMITED fields terminated by ',' 
lines terminated by '\n' 

select clazz,count(1) as counts from students group by clazz;

2.5.2 按照指定的方式将数据输出到本地

-- 创建存放数据的目录
mkdir -p /usr/local/soft/xxx

-- 导出查询结果的数据
insert overwrite local directory '/usr/local/soft/bigdata30/hive_out1/person_data' 
ROW FORMAT DELIMITED fields terminated by ',' 
collection items terminated by '-' 
map keys terminated by ':' 
lines terminated by '\n' 
select * from t_person;

2.5.3  将查询结果输出到HDFS
    export table t_person to "bigdata30/copy/ ";  

2.5.4  将表结构和数据同时备份

          将数据导出到HDFS

//创建存放数据的目录
hdfs dfs -mkdir -p /usr/local/soft/bigdata30/copy

//导出查询结果的数据
export table t_person to '/shujia/bigdata30/copy';

删除表结构

drop table table_name;

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值