目录
前言
一、数据仓库基本概念
二、Apache Hive入门
1.Apache Hive概述
2.Apache Hive架构与组件
三、Apache Hive安装部署
1.Apache Hive部署实战
(1) Hadoop与Hive整合
(2) Metastore服务启动方式
四、Apache Hive客户端使用
1.Hive自带客户端
五、Hive SQL语言:DDL建库、建表
1.Hive SQL之数据库相关操作
2.Hive SQL之表相关操作
六、Hive DML语句与函数使用
1.Hive SQL DML语法之加载数据
(1) Hive SQL-DML-Load加载数据
(2) Hive SQL-DML-Insert插入数据
2.Hive SQL DML语法之查询数据
3.Hive SQL Join关联查询
(1) Hive内连接(inner join)
(2) Hive左连接(left join)
4.Hive常用函数入门
(1) Hive函数的分类标准
(2) Hive常用的内置函数
总结
Apache Hive是一个强大的数据仓库工具,它利用Hadoop的能力,提供了一种高效且简单的类SQL查询语言,使得对大规模数据的分析和查询变得简单而高效。同时,Hive的架构使其具有很好的扩展性,可以轻松地添加新的功能和优化现有的功能。随着大数据技术的不断发展,Apache Hive在未来的发展中也将发挥重要的作用。
数据仓库是一个专注于存储、分析和报告数据的系统,旨在为企业的决策支持提供集成的数据环境。它是一个高度结构化的数据环境,设计用于支持复杂的查询和分析,而不是用于日常操作或事务处理。在数据仓库中,数据来源于各种外部系统,但并不对数据进行任何生产或消费。相反,数据仓库提供了一个用于分析的独立环境,其结果可以用于支持各种企业决策。
以下是数据仓库的主要特征:
此外,SQL是数据仓库主流的开发语言。SQL是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理数据。结构化查询语言(SQL)主要语法分为两个部分:数据定义语言 (DDL)和数据操纵语言 (DML)。DDL使我们有能力创建或删除表、数据库、索引等各种对象,但不涉及表中具体数据操作;DML则使我们有能力针对表中的数据进行插入、更新、删除、查询操作。
Apache Hive是Apache开源组织的一个项目,旨在提供数据仓库基础设施,其主要设计用来查询和分析存储在Hadoop分布式文件系统(HDFS)中的大规模数据集。Hive将存储在HDFS中的结构化、半结构化的数据文件映射为一张数据库表,通过类SQL的查询语言(Hive Query Language, HQL)进行数据的查询和分析。
Apache Hive为数据仓库任务提供了一个简单的类SQL的查询界面,同时为MapReduce作业提供了一个运行时环境。Hive将复杂的MapReduce程序转化为简单的HQL查询,简化了MapReduce编程,同时提供了高效的数据处理能力。
Hive的核心是将HQL转换为MapReduce程序,然后将该程序提交到Hadoop集群执行。在执行过程中,Hive利用HDFS存储数据,利用MapReduce进行查询和分析数据。
Hive架构图:
Apache Hive的架构主要包括以下几部分:
Apache Hive是一个基于Hadoop的数据仓库工具,它提供了数据提取、转换和加载(ETL)的功能,以及数据查询和分析的功能。在安装和部署Apache Hive之前,需要了解以下内容:
在安装部署Apache Hive之前,需要做好以下准备工作:
因为Hive需要将数据存储在HDFS上,并且通过MapReduce作为执行引擎处理数据,因此需要在Hadoop中添加相关配置属性,以满足Hive在Hadoop上运行。这可以通过修改Hadoop中的core-site.xml并且同步Hadoop集群的配置文件来实现,最后重启生效。
具体的安装步骤如下:
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自带了两款客户端供用户使用:bin/hive
和bin/beeline
。
第一代客户端(不推荐使用):
路径:$HIVE_HOME/bin/hive
Hive的第一代客户端是一个shell工具,主要有两个功能:一是可以在交互或批处理模式下运行Hive查询;二是可以用于启动Hive相关的服务,例如metastore服务。然而,这个客户端已经被官方标记为不推荐使用(deprecated)。
第二代客户端(推荐使用):
路径:$HIVE_HOME/bin/beeline
与第一代客户端不同,beeline是一个JDBC客户端,官方强烈推荐使用。相比于第一代客户端,beeline在性能和安全性方面都有所提升。
关系梳理:
bin/hive
则是通过Metastore服务来访问的。下面是一张展示了Hive客户端和服务之间关系的图:
bin/beeline客户端使用:
#先启动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 &
jdbc:hive2://:
,例如:jdbc:hive2://node1:10000
beeline -u jdbc:hive2://node1:10000 -e 'SELECT * FROM my_table;'
Hive SQL在使用DDL(数据定义语言)时,主要涉及到数据库和表的创建、修改和删除。DDL核心语法由CREATE、ALTER与DROP三个所组成,DDL并不涉及表内部数据的操作 。以下是关于Hive SQL DDL的解释和示例。
在Hive中,默认的数据库叫做default,存储数据位置位于HDFS的/user/hive/warehouse下;用户自己创建的数据库存储位置是/user/hive/warehouse/database_name.db下。
CREATE DATABASE database_name; 创建一个新的数据库。
COMMENT: | 数据库的注释说明语句 |
LOCATION: | 指定数据库在HDFS存储位置,默认/user/hive/warehouse/dbname.db |
WITH DBPROPERTIES: | 用于指定一些数据库的属性配置 |
USE database_name;
选择一个特定的数据库。例如:USE mydatabase;
DROP DATABASE database_name;
删除一个数据库。默认行为是只有在数据库为空时才能删除,如果要删除带有表的数据库(不为空的数据库),可以使用 CASCADE
关键字。例如:
DROP DATABASE mydatabase CASCADE;
创建表:
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默认分隔符:
Hive SQL中的DML(数据操纵语言)提供了多种方式来加载、插入和处理数据。下面将探讨Hive SQL DML中的加载数据功能。
Hive SQL的LOAD DATA
语句用于将文件或目录的数据加载到Hive表中。这种加载方式基本上是数据的移动或复制操作,不会改变数据的格式或内容。
Load语法功能:
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
hdfs://namenode:9000/user/hive/project/data1
注意:本地文件系统指的是HiveServer2服务所在机器的本地Linux文件系统,不是Hive客户端所在的本地文件系统。
除了使用LOAD DATA
语句加载数据外,Hive还支持使用INSERT
语句插入数据。这是将数据从一张表插入到另一张表或插入查询结果的一种有效方式。
Insert语法功能:
LOAD
语法加载数据到表中。INSERT
语法将数据插入到指定的表中,尤其是将查询返回的结果插入到另一张表中。insert+select:
INSERT...SELECT
语句用于将查询返回的结果作为内容插入到指定表中。需要保证查询结果列的数目和需要插入数据表格的列数目一致。如果查询出来的数据类型和插入表格对应的列数据类型不一致,将会进行转换,但是不能保证转换一定成功,转换失败的数据将会为NULL。示例:
INSERT INTO TABLE tablename select_statement1 FROM from_statement;
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支持的任何函数和运算符,但聚合函数除外。GROUP BY
:这个语句用于结合聚合函数,根据一个或多个列对结果集进行分组。出现在GROUP BY
中的select_expr
字段,要么是GROUP BY
分组的字段,要么是被聚合函数应用的字段(避免出现一个字段多个值的歧义)。HAVING
:在SQL中增加HAVING
子句的原因是WHERE
关键字无法与聚合函数一起使用。HAVING
子句可以让我们筛选分组后的各组数据,并且可以在HAVING
中使用聚合函数,因为此时where
,group by
已经执行结束,结果集已经确定。HAVING
与WHERE
的区别在于having
是在分组后对数据进行过滤,where
是在分组前对数据进行过滤;having
后面可以使用聚合函数,where
后面不可以使用聚合函数。ORDER BY
:这个语句用于根据指定的列对结果集进行排序。默认按照升序(ASC)对记录进行排序,如果希望按照降序对记录进行排序,可以使用DESC
关键字。LIMIT
:这个语句用于限制SELECT
语句返回的行数。第一个参数指定要返回的第一行的偏移量(从 Hive 2.0.0开始),第二个参数指定要返回的最大行数,当给出单个参数时,它代表最大行数,并且偏移量默认为0。执行顺序:
在查询过程中,Hive SQL的执行顺序如下:
FROM
:首先从指定的表或视图开始查询。WHERE
:然后应用WHERE
子句,对数据进行过滤。GROUP BY
:接下来执行聚合操作,根据指定的列对数据进行分组。HAVING
:然后应用HAVING
子句,对分组后的数据进行过滤。ORDER BY
:最后按照指定的列对结果进行排序。LIMIT
:限制返回结果的行数。SELECT
:选择需要返回的列。Hive中的Join操作是数据仓库中常用的操作之一,它用于将两个或多个表中的数据按照一定的条件进行组合和连接。在Hive中,Join操作的语法和规则与传统的SQL语法相似,但也有一些特定的规则和限制。下面将详细介绍Hive中的内连接(inner join)和左连接(left join)这两种常用的Join操作。
内连接是Hive中最常用的Join操作之一,它只返回两个表中满足连接条件的匹配行。内连接的语法如下:
table_reference [INNER] JOIN table_factor [join_condition];
其中,table_reference
和table_factor
分别代表两个参与连接的表,join_condition
是连接条件。内连接只有当两个表中都存在与连接条件相匹配的数据时,才会保留这些行。内连接的语法实际上等同于SQL中的"join"操作,其功能是按照指定的连接条件将两个表中的行进行匹配和组合。内连接返回的结果集中只包含满足连接条件的行,如果某个表中没有与连接条件匹配的行,那么该表的结果集将为空。
左连接是另一种常用的Join操作,它以左表的数据为准,返回左表的所有行,并根据连接条件将右表与之关联。如果右表中没有与连接条件匹配的行,那么结果集中对应的行将显示为null。左连接的语法如下:
table_reference {LEFT} [OUTER] JOIN table_reference join_condition;
在左连接中,table_reference
是左表,table_reference
是右表,join_condition
是连接条件。左连接会返回左表的所有行,并根据连接条件将右表与之关联。如果右表中没有与连接条件匹配的行,那么结果集中对应的行将显示为null。与内连接不同的是,左连接会返回左表的所有行,即左表的NULL值也会被包含在结果集中。这使得左连接在处理左表为主表或需要保留所有记录的情况下非常有用。
Hive函数是Hive的核心部分,它们使得用户能够更方便、更快捷地处理和分析数据。Hive内建了不少函数,用于满足用户不同使用需求,提高SQL编写效率。这些函数大致可以分为以下几类:数值类型函数、日期类型函数、字符串类型函数、集合函数、条件函数等。
Hive内建了不少函数,用于满足用户不同使用需求,提高SQL编写效率:
show functions;
describe function extended funcname;
Hive的函数大致可以分为两大类:内置函数(Built-in Functions)和用户定义函数(User-Defined Functions,简称UDF)。
内置函数是指Hive内建的函数,这些函数按照其处理数据的特点,又可以分为数值类型函数、日期类型函数、字符串类型函数、集合函数、条件函数等。这些内置函数是Hive的核心组成部分,可以帮助用户快速高效地处理和分析数据。
用户定义函数是指用户自己编写的函数,这些函数按照其输入输出的行数,又可以分为UDF(普通函数,一进一出)、UDAF(聚合函数,多进一出)、UDTF(表生成函数,一进多出)。用户定义函数可以扩展Hive的功能,使得用户可以根据自己的需求编写特定的函数来处理和分析数据。
本文介绍了数据仓库基本概念、Hive入门知识、Hive安装部署、Hive客户端使用、Hive SQL语言等内容,希望对大家有所帮助。