Hive(总)看完这篇,别说你不会Hive!

文章目录

1.Hive入门

1.1什么是Hive

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

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

本质是:将HQL转化成MapReduce程序

image-20200916135459253

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

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

3)执行程序运行在Yarn上

1.2 Hive的优缺点

1.2.1 优点

  1. 操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)。

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

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

4)Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执行延迟比较高。

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

1.2.2 缺点

1.Hive的HQL表达能力有限

(1)迭代式算法无法表达

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

2.Hive的效率比较低

(1)Hive自动生成的MapReduce作业,通常情况下不够智能化

(2)Hive调优比较困难,粒度较粗

1.3Hive架构原理

img

1.用户接口:Client

CLI(hive shell)、JDBC/ODBC(java访问hive)、WEBUI(浏览器访问hive)

2.元数据:Metastore

元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;

默认存储在自带的derby数据库中,推荐使用MySQL存储Metastore

3.Hadoop

使用HDFS进行存储,使用MapReduce进行计算。

4.驱动器:Driver

(1)解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。

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

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

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

image-20200916140721644

Hive通过给用户提供的一系列交互接口,接收到用户的指令(SQL),使用自己的Driver,结合元数据(MetaStore),将这些指令翻译成MapReduce,提交到Hadoop中执行,最后,将执行返回的结果输出到用户交互接口。

2.Hive安装

2.1Hive安装

《Hive安装教程》

2.2HiveJDBC访问

2.2.1启动hiveserver2服务

hiveserver2

image-20200916143756819

2.2.2连接hiveserver2服务

新建命令窗口,输入以下命令

beeline -u "jdbc:hive2://localhost:10000"

出现该图代表成功连接

image-20200916144644772

2.2.3注意

这里报错通常是由于权限不够,只需要对tmp和opt文件夹赋权即可

hadoop fs -chmod -R 777 /tmp
hadoop fs -chmod -R 777 /opt

2.3Hive常用交互命令

1.“-e”不进入hive的交互窗口执行sql语句

hive -e "查询语句"

2.“-f”执行脚本中sql语句

hive -f sql文件路径/sql文件名称

执行文件中的sql语句并将结果写入文件中

hive -f sql文件路径/sql文件名称  > 保存结果的路径

2.4Hive其他命令操作

1.退出hive窗口

exit;
quit;

2.在hive cli命令窗口中如何查看hdfs文件系统

dfs -ls /;

image-20200916150426537

3.在hive cli命令窗口中如何查看本地文件系统

!ls /opt;

image-20200916151233406

2.5Hive常见属性配置

2.5.1数据仓库位置配置

修改hive-site.xml文件的value

<property>
<name>hive.metastore.warehouse.dir</name>
<value>/opt/hive/warehouse</value>
</property>

2.5.2查询后信息显示配置

hive-site.xml文件中添加如下配置信息,就可以实现显示当前数据库,以及查询表的头信息配置。

<property>
	<name>hive.cli.print.header</name>
	<value>true</value>
</property>

<property>
	<name>hive.cli.print.current.db</name>
	<value>true</value>
</property>

重新启动hive,对比配置前后差异。

image-20200916153135946

image-20200916154010571

2.5.3运行日志信息配置

  • Hive的log默认存放在/tmp/root/hive.log目录下(root为当前用户名)

image-20200916155105713

  • 修改hive的log存放日志到/opt/hive/logs

1.修改/opt/hive/conf/hive-log4j.properties.template文件名称为hive-log4j.properties

mv hive-log4j.properties.template hive-log4j.properties

2.在hive-log4j.properties文件中修改log存放位置

hive.log.dir=/opt/hive/logs

image-20200916155615882

重启hive

image-20200916160113010

3.Hive数据类型

3.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 时间类型 '2013-01-31 00:13:00.345’
BINARY 字节数组(二进制) 1010

红标为常用的数据类型;

对于Hive的String类型相当于数据库的varchar类型,该类型是一个可变的字符串,不过它不能声明其中最多能存储多少个字符。

3.2集合数据类型

数据类型 描述 语法示例
STRUCT 相当于java语言当中没有方法的对象,只有属性。例如,如果某个列的数据类型是STRUCT{first STRING, last STRING},那么第1个元素可以通过字段.first来引用。 struct()
MAP MAP是一组键-值对元组集合,使用数组表示法可以访问数据。例如,如果某个列的数据类型是MAP,其中键->值对是’first’->’John’和’last’->’Doe’,那么可以通过字段名[‘last’]获取最后一个元素 map()
ARRAY 数组是一组具有相同类型和名称的变量的集合。这些变量称为数组的元素,每个数组元素都有一个编号,编号从零开始。例如,数组值为[‘John’, ‘Doe’],那么第2个元素可以通过数组名[1]进行引用。 Array()

3.3类型转化

可以使用CAST操作显示进行数据类型转换

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

4.DDL数据定义

4.1创建数据库

  • 创建一个数据库,数据库在HDFS上的默认存储路径是/opt/hive/warehouse/*.db
create database hivetest;
  • 避免要创建的数据库已经存在错误,增加if not exists判断。(标准写法)
create database if not exists hivetest;

image-20200916163107048

  • 创建一个数据库,指定数据库在HDFS上存放的位置
create database if not exists hivetest location 'hdfs路径';

image-20200916163354544

4.2查询数据库

  • 显示数据库
show databases;

image-20200916165802686

​ 过滤显示查询的数据库

show databases like 'hivetest*';

image-20200916165936990

  • 查看数据库详情
desc database hivetest;

image-20200916170340247

  • 切换当前数据库
use 目标数据库名称;

4.3删除数据库

  • 删除空数据库
drop database 库名;
  • 如果删除的数据库不存在,最好采用 if exists判断数据库是否存在
drop database if exists 库名;
  • 如果数据库不为空,可以采用cascade命令,强制删除
drop database 库名 cascade;

4.4创建表

  • 建表语法
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]
  • 字段解释说明

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

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

(3)COMMENT:为表和列添加注释。

(4)PARTITIONED BY创建分区表

(5)CLUSTERED BY创建分桶表

(6)SORTED BY不常用

(7)ROW 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或者使用自带的SerDe。如果没有指定ROW FORMAT 或者ROW FORMAT DELIMITED,将会使用自带的SerDe。在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的SerDe,Hive通过SerDe确定表的具体的列的数据。

SerDe是Serialize/Deserilize的简称,目的是用于序列化和反序列化。

(8)STORED AS指定存储文件类型

常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列式存储格式文件)

如果文件数据是纯文本,可以使用STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE。

(9)LOCATION :指定表在HDFS上的存储位置。

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

4.4.1内部表

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

  • 普通创建表
create table if not exists student2(
id int, name string
)
row format delimited fields terminated by '\t';
  • 根据查询结果创建表(查询的结果会添加到新创建的表中)
create table if not exists student3 as select id, name from student;
  • 根据已经存在的表结构创建表
create table if not exists student4 like student;
  • 查询表的类型
desc formatted student2;

4.4.2外部表

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

  • 管理表和外部表的使用场景

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

案例详解

分别创建employee外部表,并向表中导入数据。

Michael|Montreal,Toronto|Male,30|DB:80|Product:DeveloperLead
Will|Montreal|Male,35|Perl:85|Product:Lead,Test:Lead
Shelley|New York|Female,27|Python:80|Test:Lead,COE:Architect
Lucy|Vancouver|Female,57|Sales:89|Sales:Lead
  • 建表语句

创建员工表

create external table if not exists employee(
name string,
address array<string>,
personalInfo array<string>,
technol map<string,int>,
jobs map<string,string>)
row format delimited
fields terminated by '|'
collection items terminated by ','
map keys terminated by ':'
lines terminated by '\n';

向外部表中导入数据

load data local inpath '/root/employee.txt' into table employee;

查询结果

select * from employee;

image-20200916201159535

4.4.3管理表与外部表的互相转换

  • 修改内部表student2为外部表
alter table student2 set tblproperties('EXTERNAL'='TRUE');
  • 修改外部表student2为内部表
alter table student2 set tblproperties('EXTERNAL'='FALSE');

注意:('EXTERNAL'='TRUE')和('EXTERNAL'='FALSE')为固定写法,区分大小写!

4.5分区表(partition)

分区表实际上就是对应一个HDFS文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件。Hive中的分区就是分目录<

评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值