Hive 的基础及优化
  xiedX7D7EI15 2023年11月02日 61 0

1.Hive基本概念

1.1 什么是Hive

1) hive 简介 Hive:由 Facebook 开源用于解决海量结构化日志的数据统计工具。 Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并 提供类 SQL 查询功能。

2) Hive 本质:将 HQL 转化成 MapReduce 程序

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

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

  3、执行程序运行在 Yarn

Hive 的基础及优化_Hive

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)

Hive 的基础及优化_数据库_02

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。

Hive 的基础及优化_数据库_03

1.3.1 Hive 架构原理

Hive 的基础及优化_数据库_04

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 的基本类型

Hive 的基础及优化_Hive_05

Hive 的基础及优化_Hive_06

3.3 数据类型案例

Hive 的基础及优化_hive_07

Hive 的基础及优化_数据库_08

查询语句如下:

select friends[1],children['xiao song'],address.city from test where name="songsong";

4.数据定义&数据操作&数据查询

4.1 创建数据库

Hive 的基础及优化_Hive_09

4.1.1创建一个数据库,指定数据库在 HDFS 上存放的位置

Hive 的基础及优化_hive_10

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;

Hive 的基础及优化_Hive_11

Hive 的基础及优化_数据库_12

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、建表语法

Hive 的基础及优化_Hive_13

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 算数运算符

Hive 的基础及优化_数据库_14

4.11 常用函数

Hive 的基础及优化_数据库_15

4.12 比较运算符

Hive 的基础及优化_数据库_16

5.Hive表关联

Hive 的基础及优化_数据库_17

Hive 的基础及优化_数据库_18

6.Hive 优化

Hive 的基础及优化_hive_19

Hive 的基础及优化_数据库_20

Hive 的基础及优化_数据库_21

Hive 的基础及优化_Hive_22

Hive 的基础及优化_数据库_23

Hive 的基础及优化_hive_24


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

xiedX7D7EI15
作者其他文章 更多
最新推荐 更多

2024-05-31