万字夜里爆肝,熬夜倾情奉献 Hive最最基础应用

Hive流程

Hive与传统数据库对比

​ @ 版本号:Hive1.2.1
​ 0.13和0.14版本稳定版本,不支持但是不支持更新删除操作。
​ 1.2.1和1.2.2稳定版本,为Hive2版本(主流版本)
​ 1.2.1的程序只能连接hive1.2.1 的 hiveserver2

Hadoop简介

Hadoop是一个开源框架,用于在分布式环境中存储和处理大数据。它包含两个模块,一个是MapReduce,另一个是Hadoop分布式文件系统(HDFS).
·MapReduce: 这是一个并行编程模型,用于在大型商用硬件上处理大量机构化,半结构化和非结构化数据。
·HDFS: Hadoop分布式文件系统是Hadoop框架的一部分,用于存储和处理数据集。它提供了一个容错文件系统在商品硬件上运行。
Hadoop生态系统包含不同的子项目(工具), 例如用于帮助Hadoop模块的Sqoop, Pig和Hive。
·Sqoop: 它用于在HDFS和RDBMS之间导入和导出数据
·Pig: 这是一个用于MapReduce操作开发脚本的过程语言平台
·Hive: 它是一个用来开发SQL类型脚本来执行MapReduce操作的平台
注意: 有多种方法可以执行MapReduce操作:

· 使用Java MapReduce程序的传统方法用于结构化,半结构化和非结构化数据
· MapReduce使用Pig处理结构化和半结构化数据的脚本方法
· Hive查询语言(HiveQl或HQL) 用于MapReduce使用Hive处理结构化数据

1.为什么使用Hive

“大数据”一词用于包含巨大数据量,高速度以及日益增多的各种数据的大型数据集。使用传统的数据管理系统,处理大数据很困难。因此,Apache Software Foundation引入了一个名为Hadoop的框架来解决大数据管理和处理难题。
而仅仅在使用Hadoop时,您必须编写复杂的 Map-Reduce 作业,但现在在 Hive 的帮助下,您只需要提交SQL查询即可。Hive 主要面向熟悉 SQL 的用户。Hive 抽象了 Hadoop 的复杂性。需要注意的主要事情是Hive不需要学习java。Hive 使用称为HiveQL (HQL) 的语言,它类似于 SQL。HiveQL 自动将类似 SQL 的查询转换为 MapReduce 作业。

2.Hive是什么

Hive是建立在Hadoop上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、插叙你和分析存储在Hadoop中的大规模数据的机制。Hive定义了简单的 类SQL查询语言,称为HQL,它允许熟悉SQL的用户查询数据。同时,这个语言也允许熟悉MapReduce开发者 的开发自定义的mapper和reducer来处理内建的mapper和reducer 无法完成的复杂的分析工作。
数据仓库,英文名称为Dat a Warehouse,可以简写DWDWH。数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合。它用于分析性报告和决策支持目的而创建。为需要业务智能的企业,提供指导业务流程改进、监视时间、成本、质量以及控制。

3.Hive具体内容

  1. 查询语言:类SQL的查询语言HQL。熟悉SQL开发的开发者可以很方便使用Hive进行开发。
  2. 数据存储位置:所有Hive的数据都是存储在HDFS中的。而数据库则可以将数据保存在块设备中或者本地文件系统中。
  3. 数据格式。 Hive中没有定有专门的数据格式。而在数据库中,所有数据都会按照一定的组织存储,因此,数据库加载数据的过程会比较耗时。
  4. 数据更新。 Hive堆数据的改写和添加比较弱化,0.14版本之后支持,需要启动配置项。而数据库中的数据通常是需要经常进行修改的。
  5. 索引。Hive在加载数据的过程中不会对数据进行任何处理。因此访问延迟较高。数据库可以有很高的效率。较低的延迟。由于数据的访问延迟较高,决定了Hive不适合在线数据查询。
  6. 执行计算。Hive中执行是通过MapReduce来实现的而数据库通常有自己的执行引擎。
  7. 数据规模。由于HIve建立在集群上并可以利用MapReduce进行并行计算,因此可以支持很大规模的数据;对应的,数据库可以支持的数据规模较小。

4.Hive的存储格式

Hive会为每个创建的数据在HDFS上创建一个目录,该数据库的表会以子目录形式存储,表中的数据会以表目录下的文件形式存储。对于default数据库,默认的缺省数据库没有自己的目录,default数据库下的表默认存放在/usr/hive/warehouse目录下

Hive的数据存储基于Hadoop HDFS。
Hive的没有专门的数据文件格式,常见的有以下几种。

  1. TEXTFILE 为默认格式,存储方式为行存储。数据不做压缩,磁盘开销大,数据解析开销大。

  2. SEQUENCEFILE 是Hadoop API提供的一种二进制文件支持,其具有使用方便、可分割、可压缩的特点。

    三种压缩选择: NONE,RECORD,BLOCK。 Record压缩率低,一般建议使用BLOCK压缩

  3. AVRO

  4. RCFILE 一种行列存储相结合的存储方式。

  5. ORCFILE 数据按照行分块,每个块按照列存储,其中每个块都存储有一个索引。hive给出的新格式,属于RCFILE的升级版,性能有大幅度提升,而且数据可以压缩存储,压缩快 快速列存取

  6. PARQUET 也是一种行式存储,同时具有很好的压缩性能;同时可以减少大量的表扫描和反序列化的时间。

存储效率及执行速度对比

@河道大寒

读取操作效率对比

@河道大寒

5.Hive的重要特性

· 在Hive中,首先创建表和数据库,然后将数据加载到这些表中。
· Hive作为数据仓库,设计用于仅管理和查询存储在表中的结构化数据。
· 在处理结构化数据时, Map Reduce没有像UDF那样的优化和可用性功能,但Hive框架有。查询优化是指在性能方面的一种有效的查询执行方式。
· Hive的受SQL启发的语言将用户与MapReduce编程的复杂性分开。它重用了关系数据库中熟悉的概念,例如表、行、列和模式等,以便于学习。
· Hadoop的编程适用于平面文件。因此,Hive可以使用目录结构对数据机型"分区",以提高某些 查询性能。
· Hive的一个新的重要组件,即用于存储架构信息的Metastore。此metastore通常驻留在关系数据库中。我们可以使用以下方法与Hive进行交互
· Web GUI
· Java 数据库(JDBC)接口
· 大多数交互往往通过命令行界面(CLI)进行。Hive提供了一个CLI来使用Hive查询语言(HQL)编写Hive查询
· 通常,HQL语言类似于大多数数据分析师熟悉的SQL语法。下面的示例查询显示提到的表名中存在的所有记录
· **示例查询:**Select * from
· Hive支持四种文件格式,即TEXTFILE、SEQUENCFILE、ORC和RCFILE(记录列文件)。
·对于单用户元数据存储,Hive使用derby数据库,对于多用户元数据或共享元数据情况,Hive使用MYSQL。

关于Hive的一些关键点:

· HQL和SQL的主要区别在于Hive查询在Hadoop的基础架构上执行,而不是在传统数据上执行。
· Hive查询执行将类似于一系列自动生成的mapreduce作业。 
· Hive支持分区和桶概念,一边在客户端执行查询时轻松检索数据。
· Hive支持自定义特定的UDF(用户定义函数) 用于数据清理、过滤等。根据程序员的要求可以定义Hive UDF。

Hive和关系数据之间的一些主要区别

  关系数据库是“读模式和写模式”。首先创建一个表,然后将数据插入到特定的表。在关系数据表上,可以执行插入、更新和修改等功能。
  Hive是“只读模式”。因此,更新、修改都能功能不适用于此。因为典型集群中的Hive查询运行在多个数据节点上。所以无法跨多个节点更新和修改数据。(0.13以下的Hive版本)
  此外,Hivb支持”READ Many WRITE Once“模式。意味着在插入表后,我们可以在最新的Hive版本中更新表。
  之一:但是新版本Hive带有更新的功能。Hive版本(Hive 0.14)提供了更新和删除选项作为新功能

Hive结构

在这里插入图片描述

6.Hive操作客户端

常用的2个:CLI,JDBC/ODBC
· CLI, 即Shell命令行
· JDBC/ODBC 是Hive的Java, 与使用传统数据库JDBC的方式类似。
· Hive将元数据存储在数据库中(metastyore), 目前只支持mysql、derby。
· Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等;由解释器、编译器、优化器完成HQL查询语句,从此法分析、语法分析、编译、优化以及查询计划(破烂)的生成。生成的查询计划存储在HDFS中,并在随后由MapReduce调用执行。
· Hive的数据存储在HDFS中,大部分的查询由MapReduce完成(包含*的查询,比如select * from table 不会生成MapReduce任务

7.Hive的Metastore

· metastore是hive元数据的集中存放地
· metastore默认使用内嵌的derby数据库作为存储引擎
· Derby引擎的缺点:一次只能打开一个会话
· 使用MySQL作为外置存储引擎,多用户同时访问
· 元数据详解见:查看mysql SDS表和TBLS表 --> 元数据详解啦

Hive 存储和计算:

Meta存储、文件系统、Job Client等Hive服务依次与Hive存储通信并执行以下操作
· 在Hive中创建的表的元数据存储在Hive”元存储数据库“中。
· 查询结果和加载到表中的数据将存储在HDFS上的Hadoop集群中。

job执行流程

在这里插入图片描述

Hive中的数据流按以下模式运行:

从UI(用户界面)或interface(接口)执行查询
驱动程序正在与Compiler交互以获取计划。(这里的计划是指查询执询)流程及其相关元数据信息的收集
编译器为要执行的作业创建计划。编译器与Meta存储通信以获取元数据请求
元存储将元数据信息发回编译器
编译器与驱动程序通信并提出执行查询的计划
驱动程序将执行计划发送到执行引擎
执行引擎(EE)充当Hive和Hadoop之间的桥梁来处理查询。用于DFS操作。
从驱动获取结果
将结果发送到执行引擎。一旦从数据节点获取结果到EE,它就会将结果发送回驱动程序和UI或interface(接口)

我们将第七步拿出来详解

  1. DFS操作
    · EE应首先联系Name Node,然后联系Data节点以获取存储在表中的值。
    · EE将从数据节点获取所需的记录。表的实际数据仅驻留在数据节点中。而从名称节点,它只获取查询的元数据信息
    · 它从与提到的查询相关的数据节点收集实际数据
    · 执行引擎(EE)与Hive中存在的原存储进行双向操作。以执行DDL(数据定义语言)操作。这里完成了CREATE、DROP和ALTERING表和数据库等DDL操作。原存储有关数据库名称、表名称和列名称的信息。它将获取与提到的查询有关的数据。
    · 执行引擎(EE)反过来与Hadoop守护进程(例如 Name node、 Data node和Job tracker)通信以在Hadoop文件系统之上执行查询

8.Hive基础建表语法和加载数据

Hive建表
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
  // 定义字段名,字段类型
  [(col_name data_type [COMMENT col_comment], ...)]
  // 给表加上注解
  [COMMENT table_comment]
  // 分区
  [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
  // 分桶
  [CLUSTERED BY (col_name, col_name, ...) 
  // 设置排序字段 升序、降序
  [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
  [
  	// 指定设置行、列分隔符 
   [ROW FORMAT row_format] 
   // 指定Hive储存格式:textFile、rcFile、SequenceFile 默认为:textFile
   [STORED AS file_format]
   
   | STORED BY 'storage.handler.class.name' [ WITH SERDEPROPERTIES (...) ]  (Note:  only available starting with 0.6.0)
  ]
  // 指定储存位置
  [LOCATION hdfs_path]
  // 跟外部表配合使用,比如:映射HBase表,然后可以使用HQL对hbase数据进行查询,当然速度比较慢
  [TBLPROPERTIES (property_name=property_value, ...)]  (Note:  only available starting with 0.6.0)
  [AS select_statement]  (Note: this feature is only available starting with 0.5.0.)
建表1:全部使用默认建表方式
create table students
(
    id bigint,
    name string,
    age int,
    gender string,
    clazz string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; // 必选,指定列分隔符 
建表2:指定location (这种方式也比较常用)
create table students2
(
    id bigint,
    name string,
    age int,
    gender string,
    clazz string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/input1'; // 指定Hive表的数据的存储位置,一般在数据已经上传到HDFS,想要直接使用,会指定Location,通常Locaion会跟外部表一起使用,内部表一般使用默认的location
建表3:指定存储格式
create table students3
(
    id bigint,
    name string,
    age int,
    gender string,
    clazz string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS rcfile; // 指定储存格式为rcfile,inputFormat:RCFileInputFormat,outputFormat:RCFileOutputFormat,如果不指定,默认为textfile,注意:除textfile以外,其他的存储格式的数据都不能直接加载,需要使用从表加载的方式。
建表4:create table xxxx as select_statement(SQL语句) (这种方式比较常用)
create table students4 as select * from students2;
建表5:create table xxxx like table_name 只想建表,不需要加载数据
create table students5 like students;
Hive加载数据
1、使用hdfs dfs -put '本地数据' 'hive表对应的HDFS目录下'
2、使用 load data inpath

下列命令需要在hive shell里执行

// 将HDFS上的/input1目录下面的数据 移动至 students表对应的HDFS目录下,注意是 移动、移动、移动
load data inpath '/input1/students.txt' into table students;
// 清空表
truncate table students;
// 加上 local 关键字 可以将Linux本地目录下的文件 上传到 hive表对应HDFS 目录下 原文件不会被删除
load data local inpath '/usr/local/soft/data/students.txt' into table students;
// overwrite 覆盖加载
load data local inpath '/usr/local/soft/data/students.txt' overwrite into table students;
3、create table xxx as SQL语句
4、insert into table xxxx SQL语句 (没有as)
// 将 students表的数据插入到students2 这是复制 不是移动 students表中的表中的数据不会丢失
insert into table students2 select * from students;

// 覆盖插入 把into 换成 overwrite
insert overwrite table students2 select * from students;

.Hive的分区与分桶

参考文案:图、概念
特性

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值