0


从零开始了解大数据(六):数据仓库Hive篇


前言

Apache Hive是一个强大的数据仓库工具,它利用Hadoop的能力,提供了一种高效且简单的类SQL查询语言,使得对大规模数据的分析和查询变得简单而高效。同时,Hive的架构使其具有很好的扩展性,可以轻松地添加新的功能和优化现有的功能。随着大数据技术的不断发展,Apache Hive在未来的发展中也将发挥重要的作用。


一、数据仓库基本概念

数据仓库是一个专注于存储、分析和报告数据的系统,旨在为企业的决策支持提供集成的数据环境。它是一个高度结构化的数据环境,设计用于支持复杂的查询和分析,而不是用于日常操作或事务处理。在数据仓库中,数据来源于各种外部系统,但并不对数据进行任何生产或消费。相反,数据仓库提供了一个用于分析的独立环境,其结果可以用于支持各种企业决策。

以下是数据仓库的主要特征:

  • 面向主题性(Subject-Oriented):数据仓库的主题是一个抽象概念,对应于企业中某一宏观分析领域所涉及的分析对象。主题是一个独立、完整的数据集合,用于描述某一特定的业务领域或问题。传统的事务处理系统(OLTP)的数据划分并不适用于决策分析,而基于主题的数据则具有更高的分析价值。
  • 集成性(Integrated):进入数据仓库的数据通常来自多个操作型系统,这些系统可能是分散的、独立的和异构的。在数据进入仓库之前,必然要经过统一和综合的步骤,包括数据的抽取、清理、转换和汇总。这一步是数据仓库建设中最关键和最复杂的步骤。
  • 非易失性、非异变性(Non-Volatile、Non-Variant):数据仓库是分析数据的平台,而不是创造数据的平台。一旦数据进入数据仓库后,它就变得稳定且不会改变。数据仓库反映的是一段相当长的时间内历史数据的内容,一般只涉及查询操作,修改和删除操作很少。
  • 时变性(Time-Variant):数据仓库包含各种粒度的历史数据,这些数据可能与某个特定日期、星期、月份、季度或年份有关。当业务变化后,数据可能会失去时效性,因此数据仓库的数据需要随着时间更新,以适应决策的需要。

此外,SQL是数据仓库主流的开发语言。SQL是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理数据。结构化查询语言(SQL)主要语法分为两个部分:**数据定义语言 (DDL)数据操纵语言 (DML)**。DDL使我们有能力创建或删除表、数据库、索引等各种对象,但不涉及表中具体数据操作;DML则使我们有能力针对表中的数据进行插入、更新、删除、查询操作。

二、Apache Hive入门

Apache Hive是Apache开源组织的一个项目,旨在提供数据仓库基础设施,其主要设计用来查询和分析存储在Hadoop分布式文件系统(HDFS)中的大规模数据集。Hive将存储在HDFS中的结构化、半结构化的数据文件映射为一张数据库表,通过类SQL的查询语言(Hive Query Language, HQL)进行数据的查询和分析。

1.Apache Hive概述

Apache Hive为数据仓库任务提供了一个简单的类SQL的查询界面,同时为MapReduce作业提供了一个运行时环境。Hive将复杂的MapReduce程序转化为简单的HQL查询,简化了MapReduce编程,同时提供了高效的数据处理能力。

Hive的核心是将HQL转换为MapReduce程序,然后将该程序提交到Hadoop集群执行。在执行过程中,Hive利用HDFS存储数据,利用MapReduce进行查询和分析数据。

2.Apache Hive架构与组件

Hive架构图:

Apache Hive的架构主要包括以下几部分:

  • 用户接口:Hive提供了多种用户接口,包括命令行接口(CLI)、JDBC/ODBC、WebGUI等。其中,CLI是通过shell命令行与Hive进行交互;Hive的Thrift服务器允许外部客户端通过网络与Hive进行交互,类似于JDBC或ODBC协议;WebGUI则是通过浏览器访问Hive。
  • 元数据存储:Hive中的元数据通常存储在关系数据库中,如MySQL/Derby。Hive中的元数据包括表的名字、表的列和分区及其属性、表的属性(是否为外部表等)、表的数据所在目录等。
  • Driver驱动程序:Driver驱动程序包括语法解析器、计划编译器、优化器、执行器等部分。完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,并在随后由执行引擎调用执行。
  • 执行引擎:Hive本身并不直接处理数据文件,而是通过执行引擎处理。当下Hive支持MapReduce、Tez、Spark三种执行引擎。

三、Apache Hive安装部署

Apache Hive是一个基于Hadoop的数据仓库工具,它提供了数据提取、转换和加载(ETL)的功能,以及数据查询和分析的功能。在安装和部署Apache Hive之前,需要了解以下内容:

  • Hive Metadata:Hive Metadata是Hive的元数据,包含了使用Hive创建的数据库、表、表的位置、类型、属性以及字段顺序类型等元信息。元数据存储在关系型数据库中,可以是Hive内置的Derby或者第三方数据库如MySQL等。
  • Hive Metastore:Hive Metastore是元数据服务,它的作用是管理元数据,并将元数据暴露给外部客户端。Metastore服务通过连接关系型数据库来存储和读取元数据。有了Metastore服务,多个客户端可以同时连接,并且这些客户端不需要知道MySQL数据库的用户名和密码,只需要连接Metastore服务即可。这种配置方式也保证了Hive元数据的安全性。
  • Metastore配置方式:Metastore服务有三种配置模式,分别为内嵌模式、本地模式和远程模式。在生产环境中,建议使用远程模式来配置Hive Metastore。在这种模式下,其他依赖Hive的软件可以通过Metastore访问Hive,并且可以完全屏蔽数据库层,带来更好的可管理性和安全性。

1.Apache Hive部署实战

在安装部署Apache Hive之前,需要做好以下准备工作:

  • 服务器基础环境:确保服务器的基础环境正常,包括集群时间同步、防火墙关闭、主机Host映射、免密登录和JDK安装等。
  • Hadoop集群健康可用:在启动Hive之前,必须先启动Hadoop集群。特别要注意的是,需要等待HDFS安全模式关闭之后再启动运行Hive。Hive不是分布式安装运行的软件,它的分布式特性主要借由Hadoop完成,包括分布式存储和分布式计算。

(1) Hadoop与Hive整合

因为Hive需要将数据存储在HDFS上,并且通过MapReduce作为执行引擎处理数据,因此需要在Hadoop中添加相关配置属性,以满足Hive在Hadoop上运行。这可以通过修改Hadoop中的core-site.xml并且同步Hadoop集群的配置文件来实现,最后重启生效。

具体的安装步骤如下:

  • Step1: MySQL安装只需要在一台机器上安装并且需要授权远程访问。
  • Step2: 上传并解压Hive安装包(在node1上安装即可)。

  • Step3: 修改hive-env.sh文件,根据实际情况配置Hive的环境变量。

  • Step4: 新增hive-site.xml文件,根据实际需求配置Hive的属性参数。

  • Step5: 添加驱动并初始化Hive的元数据(上传MySQL JDBC驱动到Hive安装包lib路径下通过调用Metastore服务来初始化Hive的元数据)。

(2) Metastore服务启动方式

Metastore服务启动方式有两种前台启动后台启动

前台启动进程会一直占据终端ctrl + c结束进程服务关闭可以根据需求添加参数开启debug日志获取详细日志信息便于排错。

#前台启动  关闭ctrl+c
/export/server/apache-hive-3.1.2-bin/bin/hive --service metastore

#前台启动开启debug日志
/export/server/apache-hive-3.1.2-bin/bin/hive --service metastore --hiveconf hive.root.logger=DEBUG,console  

后台启动进程挂起输出日志信息在/root目录下nohup.out文件中通过调用nohup命令和后台运行符号&来实现。

#后台启动 进程挂起  关闭使用jps+ kill -9
nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore &

四、Apache Hive客户端使用

1.Hive自带客户端

Apache Hive自带了两款客户端供用户使用:

bin/hive

bin/beeline

第一代客户端(不推荐使用):

路径:$HIVE_HOME/bin/hive

Hive的第一代客户端是一个shell工具,主要有两个功能:一是可以在交互或批处理模式下运行Hive查询;二是可以用于启动Hive相关的服务,例如metastore服务。然而,这个客户端已经被官方标记为不推荐使用(deprecated)。

第二代客户端(推荐使用):

路径:$HIVE_HOME/bin/beeline

与第一代客户端不同,beeline是一个JDBC客户端,官方强烈推荐使用。相比于第一代客户端,beeline在性能和安全性方面都有所提升。

关系梳理:

  • HiveServer2通过Metastore服务来读取和写入元数据。因此,在远程模式下,必须先启动metastore服务,然后才能启动HiveServer2服务。
  • 在远程模式下,beeline客户端只能通过HiveServer2服务来访问Hive,而bin/hive则是通过Metastore服务来访问的。

下面是一张展示了Hive客户端和服务之间关系的图:

bin/beeline客户端使用:

  • 在安装了Hive的服务器上,首先启动metastore服务,然后启动hiveserver2服务。可以使用以下命令来完成:
#先启动metastore服务,然后启动hiveserver2服务
nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore &
nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service hiveserver2 &
  • hiveserver2服务在启动后需要稍等一会才能开始对外提供服务。
  • Beeline是一个JDBC的客户端,它通过JDBC协议与Hiveserver2服务进行通信。连接地址的格式为:jdbc:hive2://<node_name>:<port>,例如:
jdbc:hive2://node1:10000
  • 使用beeline客户端时,可以通过命令行参数或者直接在命令行中输入SQL语句来执行查询。例如:
beeline -u jdbc:hive2://node1:10000 -e 'SELECT * FROM my_table;'

五、Hive SQL语言:DDL建库、建表

Hive SQL在使用DDL(数据定义语言)时,主要涉及到数据库和表的创建、修改和删除。DDL核心语法由CREATE、ALTER与DROP三个所组成,DDL并不涉及表内部数据的操作 。以下是关于Hive SQL DDL的解释和示例。

1.Hive SQL之数据库相关操作

在Hive中,默认的数据库叫做default,存储数据位置位于HDFS的/user/hive/warehouse下;用户自己创建的数据库存储位置是/user/hive/warehouse/database_name.db下。

  • 创建数据库CREATE DATABASE database_name; 创建一个新的数据库。


COMMENT:数据库的注释说明语句LOCATION:指定数据库在HDFS存储位置,默认/user/hive/warehouse/dbname.dbWITH DBPROPERTIES:用于指定一些数据库的属性配置

  • 使用数据库USE database_name; 选择一个特定的数据库。例如:
USE mydatabase;
  • 删除数据库DROP DATABASE database_name; 删除一个数据库。默认行为是只有在数据库为空时才能删除,如果要删除带有表的数据库(不为空的数据库),可以使用 CASCADE 关键字。

例如:

DROP DATABASE mydatabase CASCADE;

2.Hive SQL之表相关操作

创建表

CREATE TABLE [IF NOT EXISTS] [db_name.]table_name
(col_name data_type [COMMENT col_comment], ... )
[COMMENT table_comment]
[ROW FORMAT DELIMITED …];

在建表语句中,语法的顺序需要和上述顺序保持一致。

[ ]

中的语法表示可选。

  • IF NOT EXISTS 是一个可选的语句,用于防止在表已经存在的情况下创建新表。
  • PARTITIONED BY (partition_column data_type) 用于指定表的分区方式,这可以提高查询性能。
  • ROW FORMAT DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] 用于指定字段之间的分隔符。例如,如果要使用逗号作为分隔符,并使用双引号来转义字段中的逗号,可以使用。
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ESCAPED BY '"';

Hive默认分隔符:

  • 分隔符的指定语法是可选的。如果没有指定,将使用默认的分隔符('\001')。这个默认的分隔符是一种特殊的字符,其ASCII编码值无法通过键盘直接输入。在vim编辑器中,可以通过连续按下Ctrl+v和Ctrl+a来输入这个字符。Hive的默认分隔符和Apache Hadoop中的分隔符相同,都是'\001'。这种分隔符也被称为SOH(Start of Header)。

六、Hive DML语句与函数使用

1.Hive SQL DML语法之加载数据

Hive SQL中的DML(数据操纵语言)提供了多种方式来加载、插入和处理数据。下面将探讨Hive SQL DML中的加载数据功能。

**(1) **Hive SQL-DML-Load加载数据

Hive SQL的

LOAD DATA

语句用于将文件或目录的数据加载到Hive表中。这种加载方式基本上是数据的移动或复制操作,不会改变数据的格式或内容。

Load语法功能:

  • 将数据文件或目录移动到与Hive表对应的位置。此操作是纯复制或移动,意味着在数据被加载到表中时,Hive不会对表中的数据内容进行任何转换或处理。

Load语法规则:

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename;
filepath

:表示待移动数据的路径,可以是文件或目录的路径。路径可以是相对路径、绝对路径,或是具有schema的完整URI。

LOCAL

关键字:指定了数据文件是在本地文件系统中。如果指定了

LOCAL

filepath

将被解释为本地文件系统的路径。如果没有指定

LOCAL

,则

filepath

被解释为HDFS中的路径。
filepath文件路径的三种形式:

  • 相对路径,例如:project/data1
  • 绝对路径,例如:/user/hive/project/data1
  • 具有schema的完整URI,例如:hdfs://namenode:9000/user/hive/project/data1

注意:本地文件系统指的是HiveServer2服务所在机器的本地Linux文件系统,不是Hive客户端所在的本地文件系统。

**(2) **Hive SQL-DML-Insert插入数据

除了使用

LOAD DATA

语句加载数据外,Hive还支持使用

INSERT

语句插入数据。这是将数据从一张表插入到另一张表或插入查询结果的一种有效方式。

Insert语法功能:

  • Hive官方推荐的方式是首先清洗数据成为结构化文件,然后使用LOAD语法加载数据到表中。
  • 可以使用INSERT语法将数据插入到指定的表中,尤其是将查询返回的结果插入到另一张表中。

insert+select:

  • INSERT...SELECT语句用于将查询返回的结果作为内容插入到指定表中。需要保证查询结果列的数目和需要插入数据表格的列数目一致。如果查询出来的数据类型和插入表格对应的列数据类型不一致,将会进行转换,但是不能保证转换一定成功,转换失败的数据将会为NULL。

示例:

INSERT INTO TABLE tablename select_statement1 FROM from_statement;

2.Hive SQL DML语法之查询数据

Hive SQL的查询语法与传统的SQL语法类似,但为了适应大数据的处理,Hive SQL在查询语法中增加了一些特定的元素和功能。

SELECT子句:

SELECT子句用于指定需要从表中检索的列。语法如下:

SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[ORDER BY col_list]
[LIMIT [offset,] rows];
  • **select_expr**:这是查询返回的列,至少需要有一个select_expr
  • **ALL | DISTINCT**:用于指定查询返回结果中重复行的处理方式。如果没有给出这些选项,则默认值为ALL(返回所有匹配的行)。DISTINCT指定从结果集中删除重复的行。
  • **WHERE**:这是一个布尔表达式,用于过滤查询结果。当布尔表达式为true时,返回select后面expr表达式的结果,否则返回空。在WHERE表达式中,可以使用Hive支持的任何函数和运算符,但聚合函数除外。
  • 聚合操作: SQL中拥有很多可用于计数和计算的内建函数,其使用的语法是:SELECT function(列) FROM 表。聚合函数的最大特点是不管原始数据有多少行记录,经过聚合操作只返回一条数据,这一条数据就是聚合的结果。常见的聚合操作函数:

  • **GROUP BY**:这个语句用于结合聚合函数,根据一个或多个列对结果集进行分组。出现在GROUP BY中的select_expr字段,要么是GROUP BY分组的字段,要么是被聚合函数应用的字段(避免出现一个字段多个值的歧义)。
  • **HAVING**:在SQL中增加HAVING子句的原因是WHERE关键字无法与聚合函数一起使用。HAVING子句可以让我们筛选分组后的各组数据,并且可以在HAVING中使用聚合函数,因为此时where,group by已经执行结束,结果集已经确定。HAVINGWHERE的区别在于having是在分组后对数据进行过滤,where是在分组前对数据进行过滤;having后面可以使用聚合函数,where后面不可以使用聚合函数。
  • **ORDER BY**:这个语句用于根据指定的列对结果集进行排序。默认按照升序(ASC)对记录进行排序,如果希望按照降序对记录进行排序,可以使用DESC关键字。
  • **LIMIT**:这个语句用于限制SELECT语句返回的行数。第一个参数指定要返回的第一行的偏移量(从 Hive 2.0.0开始),第二个参数指定要返回的最大行数,当给出单个参数时,它代表最大行数,并且偏移量默认为0。

执行顺序:

在查询过程中,Hive SQL的执行顺序如下:

  1. FROM:首先从指定的表或视图开始查询。
  2. WHERE:然后应用WHERE子句,对数据进行过滤。
  3. GROUP BY:接下来执行聚合操作,根据指定的列对数据进行分组。
  4. HAVING:然后应用HAVING子句,对分组后的数据进行过滤。
  5. ORDER BY:最后按照指定的列对结果进行排序。
  6. LIMIT:限制返回结果的行数。
  7. SELECT:选择需要返回的列。

3.Hive SQL Join关联查询

Hive中的Join操作是数据仓库中常用的操作之一,它用于将两个或多个表中的数据按照一定的条件进行组合和连接。在Hive中,Join操作的语法和规则与传统的SQL语法相似,但也有一些特定的规则和限制。下面将详细介绍Hive中的内连接(inner join)和左连接(left join)这两种常用的Join操作。

**(1) **Hive内连接(inner join)

内连接是Hive中最常用的Join操作之一,它只返回两个表中满足连接条件的匹配行。内连接的语法如下:

table_reference [INNER] JOIN table_factor [join_condition];

其中,

table_reference

table_factor

分别代表两个参与连接的表,

join_condition

是连接条件。内连接只有当两个表中都存在与连接条件相匹配的数据时,才会保留这些行。内连接的语法实际上等同于SQL中的"join"操作,其功能是按照指定的连接条件将两个表中的行进行匹配和组合。内连接返回的结果集中只包含满足连接条件的行,如果某个表中没有与连接条件匹配的行,那么该表的结果集将为空。

**(2) **Hive左连接(left join)

左连接是另一种常用的Join操作,它以左表的数据为准,返回左表的所有行,并根据连接条件将右表与之关联。如果右表中没有与连接条件匹配的行,那么结果集中对应的行将显示为null。左连接的语法如下:

table_reference {LEFT} [OUTER] JOIN table_reference join_condition;

在左连接中,

table_reference

是左表,

table_reference

是右表,

join_condition

是连接条件。左连接会返回左表的所有行,并根据连接条件将右表与之关联。如果右表中没有与连接条件匹配的行,那么结果集中对应的行将显示为null。与内连接不同的是,左连接会返回左表的所有行,即左表的NULL值也会被包含在结果集中。这使得左连接在处理左表为主表或需要保留所有记录的情况下非常有用。

4.Hive常用函数入门

Hive函数是Hive的核心部分,它们使得用户能够更方便、更快捷地处理和分析数据。Hive内建了不少函数,用于满足用户不同使用需求,提高SQL编写效率。这些函数大致可以分为以下几类:数值类型函数、日期类型函数、字符串类型函数、集合函数、条件函数等。

**(1) **Hive函数的分类标准

Hive内建了不少函数,用于满足用户不同使用需求,提高SQL编写效率:

  • 使用show functions查看当下可用的所有函数。
show functions;
  • 通过describe function extended funcname来查看函数的使用方式。
describe function extended funcname;

Hive的函数大致可以分为两大类:内置函数(Built-in Functions)和用户定义函数(User-Defined Functions,简称UDF)。

内置函数是指Hive内建的函数,这些函数按照其处理数据的特点,又可以分为数值类型函数、日期类型函数、字符串类型函数、集合函数、条件函数等。这些内置函数是Hive的核心组成部分,可以帮助用户快速高效地处理和分析数据。

用户定义函数是指用户自己编写的函数,这些函数按照其输入输出的行数,又可以分为UDF(普通函数,一进一出)、UDAF(聚合函数,多进一出)、UDTF(表生成函数,一进多出)。用户定义函数可以扩展Hive的功能,使得用户可以根据自己的需求编写特定的函数来处理和分析数据。

**(2) **Hive常用的内置函数

  • String Functions 字符串函数:这类函数用于处理字符串数据,例如字符串的长度、字符串的截取、字符串的替换等等。

  • Date Functions 日期函数:这类函数用于处理日期和时间数据,例如日期的加减、日期的格式化、日期的判断等等。

  • Mathematical Functions 数学函数:这类函数用于进行各种数学计算,例如求绝对值、求平方、求平方根等等。

  • Conditional Functions 条件函数:这类函数用于进行条件判断和逻辑判断,例如IF语句的实现、CASE语句的实现等等。


总结

本文介绍了数据仓库基本概念、Hive入门知识、Hive安装部署、Hive客户端使用、Hive SQL语言等内容,希望对大家有所帮助。


本文转载自: https://blog.csdn.net/jiangyq_/article/details/134928522
版权归原作者 橘子-青衫 所有, 如有侵权,请联系我们删除。

“从零开始了解大数据(六):数据仓库Hive篇”的评论:

还没有评论