思维导图
HIVE介绍
Hive是Hadoop的一个模块。它是一个用于开发SQL类型脚本执行MapReduce操作的平台。
MapReduce是一种并行编程模型,用于在大型商用硬件集群上处理大量结构化、半结构化和非结构化数据。
Hadoop 模块
- Hive:用于开发SQL类型脚本执行MapReduce操作的平台。
- Sqoop:用于在HDFS和关系数据库之间导入和导出数据的工具。
- Pig:一个过程语言平台,用于开发MapReduce操作的脚本。
- Hive是一个数据仓库基础设施工具,用于在Hadoop上处理结构化数据。它位于Hadoop之上,可用于汇总大数据并简化查询和分析。
介绍
Hive是一种方便与存储在HDFS(Hadoop文件系统)中的数据一起工作的方法。它是面向SQL的查询语言。基本上,Hive是用于Hadoop集群的SQL。它是在HDFS之上构建的开源数据仓库系统,为数据添加了结构。就像数据库一样,Hive具有创建数据库、创建表和使用查询语言处理数据的功能。用于Hive的查询语言称为Hive查询语言(HQL)。
使用与SQL相关联的Hive-QL,用户能够轻松进行数据分析。Hive引擎将这些查询编译成要在Hadoop上执行的Map-Reduce作业。
Hive 特点
- 将模式存储在数据库中,并将处理过的数据存储到HDFS中
- 设计用于OLAP
- 提供名为HiveQL或HQL的SQL类型语言进行查询
- 快速、可扩展。
架构和特点的介绍
Hive 架构
- 用户界面:Hive 是一种数据仓库基础设施软件,可以在用户和 HDFS 之间创建交互。Hive 支持的用户界面有 Hive Web UI、Hive 命令行和 Hive HD Insight (在 Windows 服务器上)。
- Meta Store:Hive 选择相应的数据库服务器来存储表、数据库、表中列、数据类型和 HDFS 映射的模式或元数据。
- HiveQL 处理引擎:HiveQL 与在元数据存储上查询模式信息的 SQL 类似。它是传统 MapReduce 程序的替代品之一。使用 HiveQL,用户无需编写详细的 MapReduce 代码,只需编写类似于 SQL 的查询语句,就能实现数据处理。使用Java编写的MapReduce程序,我们可以为MapReduce作业编写查询并处理它。
- 执行引擎 HiveQL处理引擎和MapReduce的连接部分是Hive执行引擎,它处理查询并生成与MapReduce结果相同的结果。它使用了MapReduce的风格。
- HDFS或HBASE Hadoop分布式文件系统或HBASE是存储数据到文件系统的数据存储技术。
- 执行查询 Hive接口,如命令行或We
- 界面通过驱动程序(如JOBC,ODBC等数据库驱动程序)将查询发送到驱动程序以执行。
- 获取计划驱动程序利用查询编译器来解析查询以检查语法、查询计划或查询的需求。
- 获取元数据:编译器向元数据存储(任何数据库)发送元数据请求。
- 发送元数据:元数据存储将元数据作为响应发送给编译器。
- 发送计划:编译器检查需求并重新发送计划给驱动程序。到此为止,查询的解析和编译完成。
- 执行计划:驱动程序将执行计划发送给执行引擎。
- 执行作业:内部执行作业的过程是一个MapReduce作业。执行引擎将作业发送给JobTracker,JobTracker位于Name节点,并将此作业分配给TaskTracker,TaskTracker位于Data节点。
- 获取结果:执行引擎从Data节点接收结果。
- 发送结果:执行引擎将这些结果值发送给驱动程序。
- 发送结果:驱动程序将结果发送给Hive接口。
Hive 工作过程
Hive组件
- 元数据存储:它存储Hive的所有元数据,包括数据库、表、列等数据的存储。
- 驱动程序: 它包括用于拆分Hive查询语言语句的编译器、优化器和执行器。
- 查询编译器: 将HiveQL编译成一组MapReduce任务的图形。
- 执行引擎: 执行编译器生成的任务。
- Thrift服务器: 通过JOBC/ODBC驱动程序提供与其他应用程序(如MySQL、Oracle、Excel等)连接的接口。
- 命令行界面: 也称为Hive shell。用于交互式或批量数据处理。
- Web界面: 是Hive上与数据交互的可视化结构。
Hive数据存储
- 元数据存储: 元数据存储在Hive中跟踪数据库、表、列、数据类型等的所有元数据。它还跟踪HDFS映射。
- 表: Hive中可以有两种类型的表。第一种是普通表,就像数据库中的任何其他表一样。第二种是外部表,除了删除部分外,它们与普通表相似。通过HDFS映射来创建外部表,它们是指向HDFS中表的指针。这两种类型的表之间的区别在于当删除外部表时。删除的数据并没有被删除。它的数据存储在HDFS中,而在普通表的情况下,删除表时数据也会被删除。
- 分区:分区是指存储在表目录中不同子目录中的表的切片。它可以提高查询性能,特别是对带有“WHERE”子句的select语句。
- 桶:桶是哈希分区,它们加速了数据的连接和抽样。
Hive的模式
- 本地模式:如果Hadoop在伪分布式模式下安装,并且只有一个数据节点,我们可以在此模式下使用Hive。如果数据大小较小,仅限于单个本地机器,我们可以使用此模式。在本地机器上,处理小数据集将非常快速。
使用Hive设置SET mapred.job.tracker=local;
- MapReduce模式:如果Hadoop具有多个数据节点,并且数据分布在不同的节点上,则可以在此模式下使用Hive。它将在大量数据集上执行,并以并行方式执行查询。通过此模式,可以实现对大数据集的处理,并获得更好的性能。
Hive的特点
- 在Hive中,首先创建表和数据库,然后将数据加载到这些表中。
- Hive作为数据仓库,专门用于管理和查询仅存储在表中的结构化数据。
- 在处理结构化数据时,Map Reduce没有像UDF一样的优化和可用性功能,但Hive框架有。查询优化是指以性能为目标的有效查询执行方式。
- Hive的SQL风格语言将用户与Map Reduce编程的复杂性分离开来。它重用了关系数据库世界中的熟悉概念,如表、行、列和模式等,以便于学习。
- Hadoop的编程工作是基于平面文件的。因此,Hive可以使用目录结构对数据进行“分区”,以提高某些查询的性能。
- Hive的一个新而重要的组件是Metastore,用于存储架构信息。这个Metastore通常驻留在关系型数据库中。
Hive交互
- Web GUI
- Java数据库连接(JDBC)接口
- 命令行界面(CLI)。Hive提供了一个CLI来编写Hive查询,使用Hive查询语言(HQL)
Hive支持四种文件格式
- TEX TFILE
- SEQUENCEFILE
- ORC
- RCFILE(记录列式文件)
大数据软件应用端口
大数据软件 | 默认端口 |
Hadoop (HTTP) | 50070 |
YARN ResourceManager | 8088 |
MapReduce JobHistory Server | 19888 |
HDFS NameNode | 8020 |
Apache Pig | N/A |
Apache HBase Master | 16000 |
Apache Sqoop | N/A |
Apache Flume | N/A |
Apache Flink | 8081 |
Spark | 7077 |
Apache Pig,Apache Sqoop,和Apache Flume通常没有默认的通信端口,因为他们更多的是用作数据处理和集成工具,而不是服务。
HIVE 中的数据类型
Hive数据类型
- 列类型
- 字面量
- 空值
- 复杂类型
联合类型
联合是一组异构数据类型。可以使用create union创建实例。语法和示例如下:
UNIONTYPE<int, double, array<string>, struct<a:int,b:string>>
{0:1}
{1:2.0}
{2:["three"," four" ]}
{3:{"a":5,"b":" five" }}
{2:["six", "seven" ]}
{3:{"a":8,"b":"eight" }}
{0:9}
数组
Hive中的数组与Java中的使用方式相同。 语法:
ARRAY<数据类型>
映射
Hive中的映射与Java中的映射类似。 语法:
MAP<原始类型,数据类型>
结构体
Hive中的结构体类似于使用带有注释的复杂数据。 语法:
STRUCT<列名:数据类型[COMMENT列注释],...>
在 HIVE 中创建数据库
语法
Create database <DatabaseName>
示例
from pyhive import hive# 建立连接conn = hive.Connection(host="localhost", port=10000, username="your_username")# 创建一个新的游标对象cur = conn.cursor()# 执行HiveQL命令cur.execute('CREATE DATABASE userdb')# 关闭连接conn.close()
在 HIVE 中删除数据库
语法
Drop database <DatabaseName>
示例
from pyhive import hive# 建立连接conn = hive.Connection(host="localhost", port=10000, username="your_username")# 创建一个新的游标对象cur = conn.cursor()# 执行HiveQL命令cur.execute('DROP DATABASE IF EXISTS userdb')# 关闭连接conn.close()
在 HIVE 中创建表
语法
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment] [ROW FORMAT row_format] [STORED AS file_format]
示例
表示例
Sr.No | Field Name | Data Type |
1 | Eid | int |
2 | Name | String |
3 | Salary | Float |
4 | Designation | string |
注释, 行格式化字段,例如字段终止符,行终止符和存储文件类型。
COMMENT '员工详情'
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
STORED IN TEXT FILE
hive 命令行示例
CREATE TABLE IF NOT EXISTS employee ( eid int, name String, salary String, destination String)COMMENT '员工详情'ROW FORMAT DELIMITEDFIELDS TERMINATED BY '\t'LINES TERMINATED BY '\n'STORED AS TEXTFILE;
python 示例
from pyhive import hiveconn = hive.Connection(host="localhost", port=10000, username="hadoop", database="default")cursor = conn.cursor()# 创建 Hive 表create_table_query = """CREATE TABLE IF NOT EXISTS employee ( eid INT, name STRING, salary STRING, destination STRING) COMMENT '员工详情'ROW FORMAT DELIMITEDFIELDS TERMINATED BY '\t'LINES TERMINATED BY '\n'STORED AS TEXTFILE;"""cursor.execute(create_table_query)print("Table employee created successfully.")cursor.close()conn.close()
加载数据
语法
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)] LOCAL is identifier to specify the local path. It is optional. OVERWRITE is optional to overwrite the data in the table. PARTITION is optional.
示例
sample.txt
1201 Gopal 45000 Technical manager 1202 Manisha 45000 Proof reader 1203 Masthanvali 40000 Technical writer1204 Kiran 40000 Hr Admin
hive> LOAD DATA LOCAL INPATH '/home/user/sample.txt'
在 HIVE 中修改表
语法
ALTER TABLE name RENAME TO new_name ALTER TABLE name ADD COLUMNS (col_spec[, col_spec ...]) ALTER TABLE name DROP [COLUMN] column_name ALTER TABLE name CHANGE column_name new_name new_type ALTER TABLE name REPLACE COLUMNS (col_spec[, col_spec ...])Rename To… Statement
示例
hive> ALTER TABLE employee RENAME TO emp;
hive> ALTER TABLE employee CHANGE name ename String; hive> ALTER TABLE employee CHANGE salary salary Double;
内置函数
内置函数列表
- 集合函数
- 日期函数
- 数学函数
- 条件函数
- 字符串函数
- 其他函数
集合函数
这些函数用于集合。集合表示元素的分组,并根据函数名称中指定的返回类型返回单个元素或数组
返回类型
返回类型 | 函数名 | 描述 |
INT | size(Map<K.V>) | 映射类型中的数量 |
INT | size(Array<T>) | 数组类型中的数量 |
Array<K> | Map_keys(Map<K.V>) | 包含输入的键的数组 |
Array<V> | Map_values(Map<K.V>) | 包含输入的值的数组 |
Array<T> | Sort_array(Array<T>) | 对输入数组进行升序排序并返回。 |
视图和索引
视图
视图是根据用户的要求生成的。您可以将任何结果数据保存为视图。我们可以在视图上执行所有的DML操作。
语法
CREATE VIEW [IF NOT EXISTS] view_name [(column_name [COMMENT column_comment], ...) ][COMMENT table_comment] AS SELECT...
示例
假设员工表如下所示,字段为Id,Name,Salary,Designation和Dept。生成一个查询以检索薪水超过30000的员工详细信息。我们将结果存储在名为emp_30000的视图中。
hive> CREATE VIEW emp_30000 ASSELECT * FROM employeeWHERE salary>30000;
删除视图
hive> DROP VIEW emp_30000;
索引
索引就是对表的某一列进行指针的指向。创建索引意味着在表的某一列上创建一个指针。
语法
CREATE INDEX index_name ON TABLE base_table_name (col_name, ...) AS 'index.handler.class.name' [WITH DEFERRED REBUILD] [IDXPROPERTIES (property_name=property_value, ...)] [IN TABLE index_table_name] [PARTITIONED BY (col_name, ...)] [ [ ROW FORMAT ...] STORED AS ... | STORED BY ... ][LOCATION hdfs_path] [TBLPROPERTIES (...)]
示例
在 employee 表的 salary 列上创建一个名为 index_salary 的索引。
hive> CREATE INDEX inedx_salary ON TABLE employee(salary) AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler';
删除索引
DROP INDEX <index_name> ON <table_name>
hive> DROP INDEX index_salary ON employee;