1.Hive基本概念
1.1 什么是Hive
1) hive 简介 Hive:由 Facebook 开源用于解决海量结构化日志的数据统计工具。 Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并 提供类 SQL 查询功能。
2) Hive 本质:将 HQL 转化成 MapReduce 程序
1、Hive 处理的数据存储在 HDFS
2、Hive 分析数据底层的实现是 MapReduce
3、执行程序运行在 Yarn
1.2 Hive的优缺点
•1.2.1 优点
•(1)操作接口采用类 SQL 语法,提供快速开发的能力(简单、容易上手)
•(2)避免了去写 MapReduce,减少开发人员的学习成本。
•(3)Hive 的执行延迟比较高,因此 Hive 常用于数据分析,对实时性要求不高的场合。
•(4)Hive 优势在于处理大数据,对于处理小数据没有优势,因为 Hive 的执行延迟比较 高。
•(5)Hive 支持用户自定义函数,用户可以根据自己的需求来实现自己的函数(UDF/UDAF/UDTF)。
• (5.1) UDF步骤:
• 1.必须继承org.apache.hadoop.hive.ql.exec.UDF
• 2.必须实现evaluate函数,evaluate函数支持重载
• (5.1.2) UDAF & UDTF(Pass)
•1.2.2 缺点
•(1)Hive 的 HQL 表达能力有限
(1.1)迭代式算法无法表达
(1.2)数据挖掘方面不擅长,由于 MapReduce 数据处理流程的限制,效率更高的算法却 无法实现。
•(2)Hive 的效率比较低
(2.1)Hive 自动生成的 MapReduce 作业,通常情况下不够智能化
(2.2)Hive 调优比较困难,粒度较粗
1.3 Hive 架构原理
•1、用户接口:Client CLI(command-line interface)、JDBC/ODBC(jdbc 访问 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。
1.3.1 Hive 架构原理
Hive 通过给用户提供的一系列交互接口,接收到用户的指令(SQL),使用自己的 Driver, 结合元数据(MetaStore),将这些指令翻译成 MapReduce,提交到 Hadoop 中执行,最后,将 执行返回的结果输出到用户交互接口。
1.4 Hive和数据库比较
•由于 Hive 采用了类似 SQL 的查询语言 HQL(Hive Query Language),因此很容易将 Hive 理解为数据库,其实从结构上看,Hive 和数据库除了拥有类似的查询语言,再无类似之处。以下我将带着大家从多方面阐述Hive和数据库的差异。众所周知数据库可以用在Online 的应用中,但是Hive是为数仓而设计的,清楚这点,有助于从应用的角度理解Hive 的特性。
•1.4.1 查询语言
由于 SQL 被广泛的应用在数据仓库中,因此,专门针对 Hive 的特性设计了类 SQL 的查 询语言 HQL。熟悉 SQL 开发的小伙伴们可以很方便的使用 Hive 进行开发。
•1.4.2 数据更新
由于 Hive 是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。因此,Hive 中 不建议对数据的改写,所有的数据都是在加载的时候确定好的。而数据库中的数据通常是需 要经常进行修改的,因此可以使用 INSERT INTO … VALUES 添加数据,使用 UPDATE … SET 修 改数据。
•1.4.3 执行延迟
Hive 在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高。另外一个导 致 Hive 执行延迟高的因素是 MapReduce 框架。由于 MapReduce 本身具有较高的延迟,因此 在利用 MapReduce 执行 Hive 查询时,也会有较高的延迟。相对的,数据库的执行延迟较低。 当然,这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候, Hive 的并行计算显然能体现出优势。
•1.4.4 数据规模
由于 Hive 建立在集群上并可以利用 MapReduce 进行并行计算,因此可以支持很大规模 的数据;对应的,数据库可以支持的数据规模较小。
2.Hive安装部署
2.1 安装Hive
下载地址
Index of /dist/hive (apache.org)
1、把 apache-hive-xx.x.x-bin.tar.gz 上传到 linux 的/xxx/xx 目录下
2、解压 apache-hive-xx.x.x-bin.tar.gz 到/xxx/xx/目录下面
tar -zxvf /xxx/xx/
3、修改 apache-hive-xx.x.x-bin.tar.gz 的名称为 hive
mv /xxx/xx/ apache-hive-xx.x.x-bin.tar.gz / /xxx/xx/hive
4、修改/etc/profile.d/my_env.sh,添加环境变量
sudo vim /etc/profile.d/my_env.sh
5、添加内容
#HIVE_HOME
export HIVE_HOME=/xxx/xx/hive
export PATH=$PATH:$HIVE_HOME/bin
6、解决日志 Jar 包冲突
mv $HIVE_HOME/lib/log4j-slf4j-impl2.10.0.jar $HIVE_HOME/lib/log4j-slf4j-impl-2.10.0.bak
7、初始化元数据库
bin/schematool -dbType derby -initSchema
2.1.2 启动并使用Hive
1、启动Hive
bin/hive
2、使用Hive
show databases;
show tables;
create table test(id int);
insert into test values(1);
select * from test;
3、在 CRT 窗口中开启另一个窗口开启 Hive,在/tmp/test 目录下监控 hive.log 文件
Caused by: ERROR XSDB6: Another instance of Derby may have already booted the database /xxx/xx/hive/metastore_db. at org.apache.derby.iapi.error.StandardException.newException(Unknown Source) at org.apache.derby.iapi.error.StandardException.newException(Unknown Source) at org.apache.derby.impl.store.raw.data.BaseDataFileFactory.privGetJBMSLockOnDB(Unknown Source) at org.apache.derby.impl.store.raw.data.BaseDataFileFactory.run(Unknown Source)
原因在于 Hive 默认使用的元数据库为 derby,开启 Hive 之后就会占用元数据库,且不与 其他客户端共享数据,所以这就是我在前边提到的要将 Hive 的元数据地址改为 MySQL/Oracle。
3.Hive的数据类型
3.1 Hive 的基本类型
3.3 数据类型案例
查询语句如下:
select friends[1],children['xiao song'],address.city from test where name="songsong";
4.数据定义&数据操作&数据查询
4.1 创建数据库
4.1.1创建一个数据库,指定数据库在 HDFS 上存放的位置
4.2 查询数据库
•4.2.1 显示数据库
•1、显示数据库
• show databases;
•2、过滤显示数据库
• show databases like 'db_hive*’;
•4.2.2 查看数据库详情
•1、显示数据库信息
• desc database db_hive;
•2、显示数据库详细信息
• desc database extended db_hive;
4.3 修改数据库
用户可以使用 ALTER DATABASE 命令为某个数据库的 DBPROPERTIES 设置键-值对属性值, 来描述这个数据库的属性信息。
alter database db_hive set dbproperties('createtime'='20170830');
4.4 删除数据库
1、删除空数据库
drop database db_hive2;
2、如果删除的数据库不存在,最好采用 if exists 判断数据库是否存在
drop database if exists db_hive2;
3、如果数据库不为空,可以采用 cascade 命令,强制删除
drop database db_hive cascade;
4.5 创建表
1、建表语法
2、字段解释说明
(1)CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常; 用户可以用 IF NOT EXISTS 选项来忽略这个异常。
(2)EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时可以指定一个指向实 际数据的路径(LOCATION),在删除表的时候,内部表的元数据和数据会被一起删除,而外 部表只删除元数据,不删除数据。
(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。Hive 通过 SerDe 确定表 的具体的列的数据。 SerDe 是 Serialize/Deserilize 的简称, hive 使用 Serde 进行行对象的序列与反序列化。
(8)STORED AS 指定存储文件类型 常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列 式存储格式文件) 如果文件数据是纯文本,可以使用STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE。
(9)LOCATION :指定表在 HDFS 上的存储位置。
(10)AS:后跟查询语句,根据查询结果创建表。
(11)LIKE 允许用户复制现有的表结构,但是不复制数据。
4.5.1 内部表
1、理论 默认创建的表都是所谓的管理表,有时也被称为内部表。因为这种表,Hive 会(或多或 少地)控制着数据的生命周期。Hive 默认情况下会将这些表的数据存储在由配置项 hive.metastore.warehouse.dir(例如,/user/hive/warehouse)所定义的目录的子目录下。
4.5.2 外部表
1、理论 因为表是外部表,所以 Hive 并非认为其完全拥有这份数据。删除该表并不会删除掉这 份数据,不过描述表的元数据信息会被删除掉。
注:外部表删除后,hdfs 中的数据还在,但是 metadata 中 dept 的元数据已被删除(关键字 external)
4.5.3 内部表与外部表的转换
1、查询表的类型
desc formatted test;
2、修改内部表test 为外部表
alter table test set tblproperties('EXTERNAL'='TRUE’);
3、修改外部表test 为内部表
alter table test set tblproperties('EXTERNAL’=FALSE’);
4.6 修改表
4.6.1 重命名表
ALTER TABLE table_name RENAME TO new_table_name
4.6.2 增加、修改和删除表分区
alter table dept_partition add partition(day='20200405') partition(day='20200406’);
alter table dept_partition drop partition (day='20200404'), partition(day='20200405’);
4.6.3 增加/修改/替换列信息
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], ...)
4.7 删除表
drop table dept;
4.8 数据操作语言
4.8.1.1 数据导入
load data [local] inpath '数据的 path' [overwrite] into table student [partition (partcol1=val1,…)];
4.8.1.2 通过查询语句向表中插入数据
insert into test values (1,’张三’),(2,’李四’);
insert overwrite table test values (1,’张三’),(2,’李四’);
注意:insert 不支持插入部分字段
4.8.1.3、多表(多分区)插入模式(根据多张表查询结果)
from student
insert overwrite table student1 partition(month='201707') select id, name where month='201709’
insert overwrite table student2 partition(month='201706') select id, name where month='201709’
注意 :
这是一个优化,可以减少表的扫描,从而减少 JOB 中 MR的 STAGE 数量,达到优化的目的。
4.8.1.4 数据导入(AS Select)
create table if not exists student3 as select id, name from student;
4.8.2.1Insert 导出
1、将查询的结果导出到本地
insert overwrite local directory '/opt/module/hive/data/export/student' select * from student;
2、将查询的结果格式化导出到本地
insert overwrite local directory '/opt/module/hive/data/export/student1' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' select * from student;
3、将查询的结果导出到 HDFS 上(没有 local)
insert overwrite directory '/user/atguigu/student2' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' select * from student;
4.8.2.2 Hadoop 命令导出到本地
hdfs -get /user/hive/warehouse/student/student.txt /opt/module/data/export/student3.txt;
4.8.2.3 Hive Shell 命令导出
bin/hive -e 'select * from default.student;' > /opt/module/hive/data/export/student4.txt;
4.8.2.4 Export 导出到HDFS 上
export table default.student to '/user/hive/warehouse/export/student’;
4.8.2.5 Sqoop 导出(这里不详细解释)
4.8.2.5 Other(借助ETL 工具,JDBC 等…)
4.9 查询
4.9.1 查询
语法
SELECT [ALL | DISTINCT] select_expr, select_expr, ... FROM table_reference [WHERE where_condition] [GROUP BY col_list] [ORDER BY col_list] [CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY col_list] ] [LIMIT number]
注意:
(1)SQL 语言大小写不敏感。
(2)SQL 可以写在一行或者多行
(3)关键字不能被缩写也不能分行
(4)各子句一般要分行写。
4.10 算数运算符
4.11 常用函数
4.12 比较运算符
5.Hive表关联
6.Hive 优化