Hive 数据仓库介绍

目录

​编辑

一、Hive 概述

1.1 Hive产生的原因

1.2 Hive是什么?

1.3 Hive 特点

1.4 Hive生态链关系

二、Hive架构

2.1 架构图

2.2 架构组件说明

2.2.1 Interface

2.2.1.1 CLI

2.2.1.2 JDBC/ODBC

2.2.1.3 WebUI

2.2.2 MetaData

2.2.3 MetaStore

2.2.4 Hiveserver2

2.2.5 Driver

2.2.5.1 解释器

2.2.5.2 编译器

2.2.5.3 优化器

2.2.5.4 执行器

三、Hive的工作原理

3.1 工作流程及原理图

3.2 工作流程说明

四、Hive的优缺点

4.1 优点

4.2 缺点

五、Hive数据模型

5.1 数据库

5.2 表

5.2.1 内部表

5.2.2 外部表

5.3 分区

5.4 桶

六、字段类型分类

6.1基本类型

6.1.1 Numeric     Type

6.1.2 Date/Time Type

6.1.3 Misc Type

6.1.4 String Type

6.2 复杂类型

七、查询语言分类

7.1 DDL

7.2 MDL

7.3 DQL


一、Hive 概述

1.1 Hive产生的原因

1)方便对文件及数据的元数据进行管理,提供统一的元数据管理方式

2)提供更加简单的方式来访问大规模的数据集,使用SQL语言进行数据分析

1.2 Hive是什么?

官网的解析:The Apache Hive ™ data warehouse software facilitates reading, writing, and managing large datasets residing in distributed storage using SQL. Structure can be projected onto data already in storage. A command line tool and JDBC driver are provided to connect users to Hive.

hive是一个构建在Hadoop上的数据仓库工具(框架)。
可以将结构化的数据文件映射成一张数据表,并可以使用类sql的方式来对这样的数据文件进行读,写以及管理(包括元数据)。

1.3 Hive 特点

Hive具有如下特点:

1)Hive是一个构建于Hadoop顶层的 数据仓库工具 ,可以查询和管理PB级别的分布式数据。
2)支持大规模数据存储、分析,具有良好的可扩展性
3)某种程度上可以看作是 用户编程接口 ,本身不存储和处理数据。
4)依赖分布式文件系统HDFS存储数据。
5)依赖分布式并行计算模型MapReduce处理数据。
6)定义了简单的类似SQL 的查询语言——HiveQL。
7)用户可以通过编写的HiveQL语句运行MapReduce任务。
8)可以很容易把原来构建在关系数据库上的数据仓库应用程序移植到Hadoop平台上。
9)是一个可以提供有效、合理、直观组织和使用数据的分析工具。

Hive具有的特点非常适用于 数据仓库 。

1)采用批处理方式处理海量数据。数据仓库存储的是静态数据,对静态数据的分析适合采用批处理方式,不需要快速响应给出结果,而且数据本身也不会频繁变化;
2)提供适合数据仓库操作的工具。Hive本身提供了一系列对数据进行提取、转换、加载(ETL)的工具,可以存储、查询和分析存储在Hadoop中的大规模数据。这些工具能够很好地满足数据仓库各种应用场景;
3)支持MapReduce,Tez,Spark等多种计算引擎;
4)可以直接访问HDFS文件以及HBase;
5)易用易编程。

1.4 Hive生态链关系

Hive是Hadoop生态的一员,依托于Hadoop生态,赋予了其强大的生命力。Hive与其他Hadoop组件的关系为

1)Hive依赖于HDFS 存储数据
2)Hive依赖于MapReduce 处理数据
3)在某些场景下Pig可以作为Hive的替代工具
4)HBase 提供数据的实时访问

二、Hive架构

2.1 架构图

2.2 架构组件说明

2.2.1 Interface

Hive提供三个主要的用户接口。

2.2.1.1 CLI

CLI 是Shell命令行接口,提供交互式 SQL 查询

2.2.1.2 JDBC/ODBC

JDBC/ODBC 是Hive的Java数据接口实现,使远程客户端可以通过Hiveserver2查询数据;例如 beeline 方式

2.2.1.3 WebUI

用户可以通过浏览器访问Hive页面,查看Hive使用的信息

2.2.2 MetaData

Hive将元数据存储在RMDB中,如MySQL\Derby\Postgresql。元数据包括表结构、表名、列属性、分区信息、权限信息及Location等信息。

2.2.3 MetaStore

Hive提供的元数据查询服务,通过MetaStore管理、操作元数据

2.2.4 Hiveserver2

基于thrift的跨平台、跨编程语言的Hive查询服务。为Hive客户端提供远程访问、查询服务

2.2.5 Driver

Hive 的核心是驱动引擎, 驱动引擎由解释器、编译器、优化器、执行器四部分组成

2.2.5.1 解释器

解释器的作用是将 HiveSQL 语句转换为抽象语法树(AST Abstract-Syntax-Tree)

2.2.5.2 编译器

编译器是将语法树编译为逻辑执行计划

2.2.5.3 优化器

优化器是对逻辑执行计划进行优化

2.2.5.4 执行器

执行器是调用底层的运行框架执行逻辑执行计划

三、Hive的工作原理

3.1 工作流程及原理图

3.2 工作流程说明

1) 用户把查询任务提交给Driver驱动程序

2)驱动程序将Hql发送给编译器Compiler

3)编译器Compiler根据用户查询任务去MetaStore中获取需要的Hive的元数据信息

4)编译器Compiler得到元数据信息,对任务进行编译

4.1)依据Antlr语法规则,解析HiveQL并转换为AST抽象语法树
4.2)遍历AST抽象语法树,抽象出查询的基本组成单元QueryBlock(查询块)
4.3)依据QueryBlock生成逻辑执行计划
4.4)优化、重写逻辑执行计划,合并不必要的ReduceSinkOperator,降低shuffle
4.5)依据逻辑执行计划生成物理执行计划,也就是Hive Job的Task树(默认是MapReduce Job)
4.6)优化、重写物理执行计划

5)将最终的执行计划(Hive Job)提交给Driver。到此为止,查询解析和编译完成

6)Driver将执行计划(Hive Job)转交给ExecutionEngine去执行

7)在Yarn上,执行作业的过程默认是一个MapReduce任务

7.1)执行引擎发送作业给JobTracker
7.2)JobTracker将task下发给到TaskTracker执行
7.3)task读、写HDFS数据

四、Hive的优缺点

4.1 优点

1)高可靠、高容错:HiveServer采用集群模式。双MetaStor。超时重试机制。
2)类SQL:类似SQL语法,内置大量函数。
3)可扩展:自定义存储格式,自定义函数。
4)多接口:Beeline,JDBC,ODBC,Python,Thrift。

4.2 缺点

1)延迟较高:默认MR为执行引擎,MR延迟较高。
2)不支持雾化视图:Hive支持普通视图,不支持雾化视图。Hive不能再视图上更新、插入、删除数据。
3)不适用OLTP:暂不支持列级别的数据添加、更新、删除操作。
4)暂不支持存储过程:当前版本不支持存储过程,只能通过UDF来实现一些逻辑处理。

五、Hive数据模型

Hive中元数据(即对数据的描述,包括表,表的列及其它各种属性)一般存储在MySQL等数据库中的,因为这些数据要不断的更新,修改,不适合存储在HDFS中。而真正的数据是存储在HDFS中,这样更有利于对数据做分布式运算。

Hive中主要包括四类数据模型:

数据库:Hive 中的DB类似传统数据库的DataBase。
表 :Hive中的表和关系型数据库中的表在概念上很类似,每个表在HDFS中都有相应的目录用来存储表的数据;
分区 :在Hive中,表的每一个分区对应表下的相应目录,所有分区的数据都是存储在对应的目录中;
桶 :对指定的列计算其hash,根据hash值切分数据,目的是为了并行,每一个桶对应一个文件(注意和分区的区别)。

5.1 数据库

类似传统数据库的DataBase,默认数据库"default"。

数据库切换指令:use xxx;

创建数据库:

hive > create database test_dw;

5.2 表

Hive 表跟关系数据库里面的表类似。逻辑上,数据是存储在 Hive 表里面的,而表的元数据描述了数据的布局。我们可以对表执行过滤,关联,合并等操作。在 Hadoop 里面,物理数据一般是存储在 HDFS 的,而元数据是存储在关系型数据库的。

Hive 有下面两种表:内部表、外部表。当我们在 Hive 创建表的时候,Hive 将以默认的方式管理表数据,也就是说,Hive 会默认把数据存储到 /user/hive/warehouse 目录里面。除了内部表,我们可以创建外部表,外部表需要指定数据的目录。

5.2.1 内部表

当我们把数据 load 到内部表的时候,Hive 会把数据存储在 /user/hive/warehouse 目录下(warehouse地址是在 hive-site.xml 中由hive.metastore.warehouse.dir属性指定的数据仓库的目录)。

CREATE TABLE managed_table (dummy STRING);
LOAD DATA INPATH '/user/tom/data.txt' INTO table managed_tabl

根据上面的代码,Hive 会把文件 data.txt 文件存储在 managed_table 表的 warehouse 目录下,即 hdfs://user/hive/warehouse/managed_table 目录。

如果我们用 drop 命令把表删除,这样将会把表以及表里面的数据和表的元数据都一起删除。

DROP TABLE managed_table

5.2.2 外部表

外部表与内部表的行为上有些差别。我们能够控制数据的创建和删除。删除外部表的时候,Hive 只会删除表的元数据,不会删除表数据。数据路径是在创建表的时候指定的:


 

CREATE EXTERNAL TABLE external_table (dummy STRING)
LOCATION '/user/tom/external_table';
LOAD DATA INPATH '/user/tom/data.txt' INTO TABLE external_table;

利用 **EXTERNAL** 关键字创建外部表,Hive 不会去管理表数据,所以它不会把数据移到 /user/hive/warehouse 目录下。甚至在执行创建语句的时候,它不会去检查建表语句中指定的外部数据路径是否存在。这个是比较有用的特性,我们可以在表创建之后,再创建数据。

外部表还有一个比较重要的特性,上面有提到的,就是删除外部表的时候,Hive 只有删除表的元数据,而不会删除表数据。

5.3 分区

为了提高查询数据的效率,Hive 提供了表分区机制。分区表基于分区键把具有相同分区键的数据存储在一个目录下,在查询某一个分区的数据的时候,只需要查询相对应目录下的数据,而不会执行全表扫描,也就是说,Hive 在查询的时候会进行分区剪裁。每个表可以有一个或多个分区键。

创建分区表语法:

CREATE TABLE table_name (column1 data_type, column2 data_type)
PARTITIONED BY (partition1 data_type, partition2 data_type,….);

下面通过一个例子来更好的理解分区概念:

假如你有一个存储学生信息的表,表名为 student_details,列分别是 student_id,name,department,year 等。现在,如果你想基于 department 列对数据进行分区。那么属于同一个 department 的学生将会被分在同一个分区里面。在物理上,一个分区其实就是表目录下的一个子目录。

假如你在 student_details 表里面有三个 department 的数据,分别为 EEE,ECE 和 ME。那么这个表总共就会有三个分区,也就是图中的绿色方块部分。对于每个 department ,您将拥有与该 department 相关的所有数据,这些数据位于表目录下的单独子目录中。

假如所有 department = EEE 的学生数据被存储在 /user/hive/warehouse/student_details/department=EEE 目录下。那么查询 department 为 EEE 的学生信息,只需要查询 EEE 目录下的数据即可,不需要全表扫描,这样查询的效率就比较高。而在真实生产环境中,你需要处理的数据可能会有几百 TB,如果不分区,在你只需要表的其中一小部分数据的时候,你不得不走全表扫描,这样的查询将会非常慢而且浪费资源,可能 95% 的数据跟你的查询语句并没有关系。

5.4 桶

对指定的列计算其hash,根据hash值切分数据,目的是为了并行,每一个桶对应一个文件(注意和分区的区别)。

Hive 可以对每一个表或者是分区,进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive 是针对表的某一列进行分桶。Hive 采用对表的列值进行哈希计算,然后除以桶的个数求余的方式决定该条记录存放在哪个桶中。分桶的好处是可以获得更高的查询处理效率。使取样更高效。

分桶表创建命令:

CREATE TABLE table_name
PARTITIONED BY (partition1 data_type, partition2 data_type,….) 
CLUSTERED BY (column_name1, column_name2, …) 
SORTED BY (column_name [ASC|DESC], …)] 
INTO num_buckets BUCKETS;

每个桶只是表目录或者分区目录下的一个文件,如果表不是分区表,那么桶文件会存储在表目录下,如果表是分区表,那么桶文件会存储在分区目录下。所以你可以选择把分区分成 n 个桶,那么每个分区目录下就会有 n 个文件。从上图可以看到,每个分区有 2 个桶。因此每个分区就会有 2 个文件,每个文件将会存储该分区下的数据。

六、字段类型分类

Hive支持原始数据类型和复杂类型,原始类型包括数值型,Boolean,字符串,时间戳。复杂类型包括数组,map,struct。官网地址:https://cwiki.apache.org/confluence/display/hive/languagemanual+types

6.1基本类型

6.1.1 Numeric     Type

数值类下包含:tinyint、small int、int/integer、bigint、float、double、numertic、decimal

6.1.2 Date/Time Type

时间类型:timestamp、date、interval

6.1.3 Misc Type

Boolean 、BINARY

6.1.4 String Type

字符串类型:String 、varchar、char

6.2 复杂类型

arrays、maps、structs、union

七、查询语言分类

7.1 DDL

大致包含以下部分内容:

* CREATE DATABASE/SCHEMA, TABLE, VIEW, FUNCTION, INDEX
* DROP DATABASE/SCHEMA, TABLE, VIEW, INDEX
* TRUNCATE TABLE
* ALTER DATABASE/SCHEMA, TABLE, VIEW
* MSCK REPAIR TABLE (or ALTER TABLE RECOVER PARTITIONS)
* SHOW DATABASES/SCHEMAS, TABLES, TBLPROPERTIES, VIEWS, PARTITIONS, FUNCTIONS, INDEX[ES], COLUMNS, CREATE TABLE
* DESCRIBE DATABASE/SCHEMA, table_name, view_name, materialized_view_name

详细内容,可参考官网地址:LanguageManual DDL - Apache Hive - Apache Software Foundation

7.2 MDL

大致包含以下部分内容:

* LOAD
* INSERT
  * into Hive tables from queries
  * into directories from queries
  * into Hive tables from SQL
* UPDATE
* DELETE
* MERGE

详细内容,可参考官网地址:LanguageManual DML - Apache Hive - Apache Software Foundation

7.3 DQL

Hive select 常规语法与 Mysql 等 RDBMS SQL 几乎无异,大致包含以下部分内容:

* Select Syntax
  * WHERE Clause
  * ALL and DISTINCT Clauses
  * Partition Based Queries
  * HAVING Clause
  * LIMIT Clause
  * REGEX Column Specification
  * More Select Syntax

详细内容,可参考官网地址:LanguageManual Select - Apache Hive - Apache Software Foundation

今天Hive相关内容就分享到这里,如果帮助到大家,欢迎大家点赞+关注+收藏,有疑问也欢迎大家评论留言!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/82637.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

巨人互动|Facebook海外户Facebook客户反馈分数

Facebook客户反馈分数是一项用于衡量用户对Facebook产品和服务满意度的指标。该指标被广泛应用于各种调研和评估活动,帮助Facebook了解用户对其平台和功能的意见和建议,并从中识别出改进的机会。 巨人互动|Facebook海外户&Facebook新闻提要的算法&am…

Python 文件写入操作

视频版教程 Python3零基础7天入门实战视频教程 w模式是写入,通过write方法写入内容。 # 打开文件 模式w写入,文件不存在,则自动创建 f open("D:/测试3.txt", "w", encoding"UTF-8")# write写入操作 内容写入…

浅谈C++|运算符重载

重载原因 C 中的运算符重载是一种特性,允许程序员定义自定义类类型的运算符操作。通过运算符重载,可以对类对象执行类似于内置类型的操作,例如加法、减法、乘法等。 运算符重载通过定义特定的成员函数或非成员函数来实现。成员函数的运算符重…

PyG-GAT-Cora(在Cora数据集上应用GAT做节点分类)

文章目录 model.pymain.py参数设置运行图 model.py import torch.nn as nn from torch_geometric.nn import GATConv import torch.nn.functional as F class gat_cls(nn.Module):def __init__(self,in_dim,hid_dim,out_dim,dropout_size0.5):super(gat_cls,self).__init__()s…

java学习--day6(数组)

文章目录 day5作业今天的内容1.数组1.1开发中为啥要有数组1.2在Java中如何定义数组1.3对第二种声明方式进行赋值1.4对数组进行取值1.5二维数组【了解】1.6数组可以当成一个方法的参数【重点】1.7数组可以当成一个方法的返回值1.8数组在内存中如何分配的【了解】 2.数组方法循环…

PFEA111–20 PFEA111–20 人工智能如何颠覆石油和天然气行业

PFEA111–20 PFEA111–20 人工智能如何颠覆石油和天然气行业 人工智能(AI)和机器学习(ML)等新技术的到来正在改变几十年来行业的运营方式。这些技术正在带来革命性的变革,影响着整个行业。石油和天然气行业在其运营过程中面临着许多挑战,如未连接的环境…

在SpringBoot项目中整合SpringSession,基于Redis实现对Session的管理和事件监听

1、SpringSession简介 SpringSession是基于Spring框架的Session管理解决方案。它基于标准的Servlet容器API,提供了Session的分布式管理解决方案,支持把Session存储在多种场景下,比如内存、MongoDB、Redis等,并且能够快速集成到Spr…

Java21 LTS版本

一、前言 除了众所周知的 JEP 之外,Java 21 还有更多内容。首先请确认 java 版本: $ java -version openjdk version "21" 2023-09-19 OpenJDK Runtime Environment (build 2135-2513) OpenJDK 64-Bit Server VM (build 2135-2513, mixed mo…

activiti7的数据表和字段的解释

activiti7的数据表和字段的解释 activiti7版本有25张表,而activiti6有28张表,activiti5有27张表,绝大部分的表和字段的含义都是一样的,所以本次整理的activiti7数据表和字段的解释,也同样适用于activiti6和5。 1、总览…

pcl--第五节 点云表面法线估算

估算点云表面法线 * 表面法线是几何表面的重要属性,在许多领域(例如计算机图形应用程序)中大量使用,以应用正确的光源以产生阴影和其他视觉效果。 给定一个几何表面,通常很难将表面某个点的法线方向推断为垂直于该点…

CockroachDB集群部署

CockroachDB集群部署 1、CockroachDB简介 CockroachDB(有时简称为CRDB)是一个免费的、开源的分布式 SQL 数据库,它建立在一个事务性和强一致性的键 值存储之上。它由 PebbleDB(一个受 RocksDB/leveldb 启发的 K/B 存储库)支持,并使用 Raft 分布式共识…

TypeScript入门

目录 一:语言特性 二:TypeScript安装 NPM 安装 TypeScript 三:TypeScript基础语法 第一个 TypeScript 程序 四:TypeScript 保留关键字 空白和换行 TypeScript 区分大小写 TypeScript 注释 TypeScript 支持两种类型的注释 …

初识C语言——详细入门一(系统性学习day4)

目录 前言 一、C语言简单介绍、特点、基本构成 简单介绍: 特点: 基本构成: 二、认识C语言程序 标准格式: 简单C程序: 三、基本构成分类详细介绍 (1)关键字 (2&#xf…

fork函数

二.fork函数 2.1函数原型 fork()函数在 C 语言中的原型如下&#xff1a; #include <unistd.h>pid_t fork(void);其中pid_t是一个整型数据类型&#xff0c;用于表示进程ID。fork()函数返回值是一个pid_t类型的值&#xff0c;具体含义如下&#xff1a; 如果调用fork()的…

MyBatis中当实体类中的属性名和表中的字段名不一样,怎么办

方法1&#xff1a; 在mybatis核心配置文件中指定&#xff0c;springboot加载mybatis核心配置文件 springboot项目的一个特点就是0配置&#xff0c;本来就省掉了mybatis的核心配置文件&#xff0c;现在又加回去算什么事&#xff0c;总之这种方式可行但没人这样用 具体操作&…

Python灰帽编程——错误异常处理与面向对象

文章目录 错误异常处理与面向对象1. 错误和异常1.1 基本概念1.1.1 Python 异常 1.2 检测&#xff08;捕获&#xff09;异常1.2.1 try except 语句1.2.2 捕获多种异常1.2.3 捕获所有异常 1.3 处理异常1.4 特殊场景1.4.1 with 语句 1.5 脚本完善 2. 内网主机存活检测程序2.1 scap…

【Java 基础篇】Java字符打印流详解:文本数据的输出利器

在Java编程中&#xff0c;我们经常需要将数据输出到文件或其他输出源中。Java提供了多种输出流来帮助我们完成这项任务&#xff0c;其中字符打印流是一个非常有用的工具。本文将详细介绍Java字符打印流的用法&#xff0c;以及如何在实际编程中充分利用它。 什么是字符打印流&a…

DNG格式详解,DNG是什么?为何DNG可以取代RAW统一单反相机、苹果安卓移动端相机拍摄输出原始图像数据标准

返回图像处理总目录&#xff1a;《JavaCV图像处理合集总目录》 前言 在DNG格式发布之前&#xff0c;我们先了解一下之前单反相机、苹果和安卓移动端相机拍照输出未经处理的原始图像格式是什么&#xff1f; RAW 什么是RAW&#xff1f; RAW是未经处理、也未经压缩的格式。可以…

Rust通用编程概念(3)

Rust通用编程概念 1.变量和可变性1.执行cargo run2.变量3.变量的可变性4.常量5.遮蔽5.1遮蔽与mut区别1.遮蔽2.mut 2.数据类型1.标量类型1.1整数类型1.2浮点数类型1.3数字运算1.4布尔类型1.5字符类型 2.复合类型2.1元组类型2.2数组类型1.访问数组2.无效的数组元素访问 3.函数3.1…

如何解决 503 Service Temporarily Unavailable?

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…