大数据之Hive总结篇及Hive优化

本文介绍了Hive作为大数据处理的工具,它基于Hadoop,提供SQL查询功能,适合大数据离线分析。Hive支持MapReduce、Spark和Tez等多种计算引擎,通过SQL对数据进行分析,简化了MapReduce编程。文章讨论了Hive的产生背景,包括大数据时代对传统数据库的挑战,以及Hive如何通过SQL实现对HDFS上文件的结构化访问。此外,还详细解析了Hive的内部表和外部表的区别,以及Hive的优化策略,如小文件问题的解决和SQL优化,包括MapJoin、并行执行和JVM重用等技术。
摘要由CSDN通过智能技术生成

Hive学习也有一段时间了,今天来对Hive进行一个总结,谈谈自己的理解,作者还是个小白,有不对的地方请大家指出相互学习,共同进步。今天来谈一谈什么是Hive,产生背景,优势等一系列问题。

 

什么是Hive

 

先来谈谈自己的理解:

有些人可能会说Hive不就是写SQL的吗,那我们其实可以从另一个角度来理解:Hive就是那么强大啊,只要写SQL就能解决问题,其实这些人说的也没错Hive确实就是写SQL的,对于传统的 DBA人员或者会写SQL就很容易上手了,但是您知道他的底层细节吗,怎么优化呢?和传统的关系型数据库又有什么区别呢?等等一系列问题。。。

 

Hive是一个构建在Hadoop之上的数据仓库软件,它可以使已经存储的数据结构化,它提供类似sql的查询语句HiveQL对数据进行分析处理。 Hive将HiveQL语句转换成一系列成MapReduce作业并执行(SQL转化为MapReduce的过程你知道吗?)。用户可以很方便的使用命令行和JDBC程序的方式来连接到hive。 目前,Hive除了支持MapReduce计算引擎,还支持Spark和Tez这两中分布式计算引擎。常用于离线批处理。 (Hive On Spark 还是试验版本)

Hive的产生背景

大数据的时代,海量的数据对于传统的关系型数据库来说维护起来成本非常高,那该如何是好,Hadoop分布式的框架,可以使用廉价的机器部署分布式系统把数据存储再HDFS之上,通过MR进行计算,分析,这样是可以的,但是,MR大家应该知道,MapReduce编程带来的不便性,编程十分繁琐,在大多情况下,每个MapReduce程序需要包含Mapper、Reduceer和一个Driver,之后需要打成jar包扔到集群上运 行。如果mr写完之后,且该项目已经上线,一旦业务逻辑发生了改变,可能就会带来大规模的改动代码,然后重新打包,发布,非常麻烦(这种方式,也是最古老的方式)

当大量数据都存放在HDFS上,如何快速的对HDFS上的文件进行统计分析操作?

一般来说,想要做会有两种方式:

学Java、学MapReduce(十分麻烦)

做DBA的:写SQL(希望能通过写SQL这样的方式来实现,这种方式较好)

然而,HDFS中最关键的一点就是,数据存储HDFS上是没有schema的概念的(schema:相当于表里面有列、字段、字段名称、字段与字段之间的分隔符等,这些就是schema信息)然而HDFS上的仅仅只是一个纯的文本文件而已,那么,没有schema,就没办法使用sql进行查询了啊。。。因此,在这种背景下,就有问题产生:如何为HDFS上的文件添加Schema信息?如果加上去,是否就可以通过SQL的方式进行处理了呢?于是强大的Hive出现了。

Hive深入剖析

再来看看官网给我们的介绍:

官方第一句话就说明了Apache Hive 是构建在Apache Hadoop之上的数据仓库。有助于对大型的数据集进行读、写和管理。

那我们先对这句话进行剖析:

首先Hive是构建在Hadoop之上的,其实就是Hive中的数据其实是存储再HDFS上的(加上LOCAL关键字则是在本地),默认在/user/hive/warehouse/table,有助于对大型数据集进行读、写和管理,那也就是意味着传统的关系型数据库已经无法满足现在的数据量了,需要一个更大的仓库来帮助我们存储,这里也引出一个问题:Hive和关系型数据库的区别,后面我们再来聊。

Hive的特征:

1.可通过SQL轻松访问数据的工具,从而实现数据仓库任务,如提取/转换/加载(ETL),报告和数据分析。

2.它可以使已经存储的数据结构化

3.可以直接访问存储在Apache HDFS™或其他数据存储系统(如Apache HBase™)中的文件

4.Hive除了支持MapReduce计算引擎,还支持Spark和Tez这两中分布式计算引擎(这里会引申出一个问题,哪些查询跑mr哪些不跑?)

5.它提供类似sql的查询语句HiveQL对数据进行分析处理。

6. 数据的存储格式有多种,比如数据源是二进制格式, 普通文本格式等等

 

而hive强大之处不要求数据转换成特定的格式,而是利用hadoop本身InputFormat API来从不同的数据源读取数据,同样地使用OutputFormat API将数据写成不同的格式。所以对于不同的数据源,或者写出不同的格式就需要不同的对应的InputFormat和Outputformat类的实现。

以stored as textfile为例,其在底层java API中表现是输入InputFormat格式:TextInputFormat以及输出OutputFormat格式:HiveIgnoreKeyTextOutputFormat.这里InputFormat中定义了如何对数据源文本进行读取划分,以及如何将切片分割成记录存入表中。而Outputformat定义了如何将这些切片写回到文件里或者直接在控制台输出。

不仅如此Hive的SQL还可以通过用户定义的函数(UDF),用户定义的聚合(UDAF)和用户定义的表函数(UDTF)进行扩展。
(几个函数之间的区别)
Hive中不仅可以使用逗号和制表符分隔值(CSV / TSV)文本文件,还可以使用Sequence File、RC、ORC、Parquet 
(知道这几种存储格式的区别),
当然Hive还可以通过用户来自定义自己的存储格式,基本上前面说的到的几种格式完全够了。
Hive旨在最大限度地提高可伸缩性(通过向Hadoop集群动态添加更多机器扩展),性能,可扩展性,
容错性以及与其输入格式的松散耦合。

Hive基本语法

 

DDL

DML

基本HQL

内置函数和基本的UDF函数

 

UDF函数这里要进行一个讲解UDF、DUAF、UDTF分别是啥。

我们知道Hive的SQL还可以通过用户定义的函数(UDF),用户定义的聚合(UDAF)和用户定义的表函数(UDTF)进行扩展。

当Hive提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数(UDF:user-defined function)。  

UDF(User-Defined-Function) 一进一出

UDAF(User- Defined Aggregation Funcation) 聚集函数,多进一出。

UDTF(User-Defined Table-Generating Functions) 一进多出,如lateral view explore()

Hive于关系型数据库的区别

时效性、延时性比较高,可扩展性高;
Hive数据规模大,优势在于处理大数据集,对于小数据集没有优势
事务没什么用(比较鸡肋,没什么实际的意义,对于离线的来说)  一个小问题:那个版本开始提供了事务?
insert/update没什么实际用途,大数据场景下大多数是select
RDBMS也支持分布式,节点有限 成本高,处理的数据量小
Hadoop集群规模更大 部署在廉价机器上,处理的数据量大
数据库可以用在Online的应用中,Hive主要进行离线的大数据分析;
数据库的查询语句为SQL,Hive的查询语句为HQL&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值