聊聊Hive的那些事儿

本文仅仅从宏观上去聊聊Hive中的一些常见问题。文末我整理了几篇其他人的文章,个人感觉对自己的学习起到了作用。有兴趣的同学可以点过去阅读。

1. Hive是什么?

Hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,能将SQL语句转变成MapReduce任务来执行。

2. Hive的优缺点

优点:
(1)操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)。
(2)避免了去写MapReduce,减少开发人员的学习成本。
(3)Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
缺点:
(1)Hive不支持记录级别的增删改操作;
(2)Hive的查询延时很严重;
(3)Hive不支持事务。

3. Hive与数据库的区别

聊聊Hive的那些事儿_第1张图片
1、Hive 和关系数据库存储文件的系统不同,Hive 使用的是 Hadoop 的HDFS(Hadoop的分布式文件系统),关系数据库则是服务器本地的文件系统;

2、Hive 使用的计算模型是 MapReduce,而关系数据库则是自己设计的计算模型;

3、关系数据库都是为实时查询的业务进行设计的,而 Hive 则是为海量数据做数据挖掘设计的,实时性很差,因为用到了Map-Reduce的计算模型;实时性的区别导致 Hive 的应用场景和关系数据库有很大的不同;

4、Hive 很容易扩展自己的存储能力和计算能力,这个是继承 Hadoop 的,而关系数据库在这个方面要差很多。

4. 内部表和外部表的区别

(1)建表语法的区别:
外部表在创建的时候需要加上external关键字;
创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径, 不对数据的位置做任何改变。
(2)删除表之后的区别:
内部表删除后,表的元数据和真实数据都被删除了;
外部表删除后,仅仅只是把该表的元数据删除了,真实数据还在,后期还是可以恢复出来。
这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。
提示:内部表与外部表的区别一定要掌握,通常情况下我们都会使用外部表保证数据安全性,但是像中间表,结果表这种我们就会考虑使用内部表(管理表)。

5. Hive分区的定义?静态分区和动态分区的概念。

在hive中,表中的一个分区对应于表下的一个目录,所有的分区的数据都存储在对应的目录中。
静态分区 SP(static partition):
  1、静态分区是在编译期间指定的指定分区名
  2、支持load和insert两种插入方式
    2.1load方式
      1)会将分区字段的值全部修改为指定的内容
      2)一般是确定该分区内容是一致的时候才会使用
    2.2insert方式
      1)必须先将数据放在一个没有设置分区的普通表中
      2)该方式可以在一个分区内存储一个范围的内容
      3)从普通表中选出的字段不能包含分区字段
  3、适用于分区数少,分区名可以明确的数据
动态分区 DP(dynamic partition):
  1、根据分区字段的实际值,动态进行分区
  2、是在sql执行的时候进行分区
  3、需要先将动态分区设置打开(set hive.exec.dynamic.partition.mode=nonstrict )
  4、只能用insert方式
  5、通过普通表选出的字段包含分区字段,分区字段放置在最后,多个分区字段按照分区顺序放置

6. 分区和分桶的区别?

分区:是指按照数据表的某列或某些列分为多个区,区从形式上可以理解为文件夹,比如我们要收集某个大型网站的日志数据,一个网站每天的日志数据存在同一张表上,由于每天会生成大量的日志,导致数据表的内容巨大,在查询时进行全表扫描耗费的资源非常多。
那其实这个情况下,我们可以按照日期对数据表进行分区,不同日期的数据存放在不同的分区,在查询时只要指定分区字段的值就可以直接从该分区查找。

分桶:分桶是相对分区进行更细粒度的划分
分桶将整个数据内容按照某列属性值的hash值进行区分,如要按照name属性分为3个桶,就是对name属性值的hash值对3取模,按照取模结果对数据分桶。
如取模结果为0的数据记录存放到一个文件,取模为1的数据存放到一个文件,取模为2的数据存放到一个文件。
总结: 分区就是在hdfs上分目录(分文件夹),分桶就是分文件。

桶表是不可以通过load将数据导入的。因为load数据的话hdfs下只会有一个文件无法完成分桶的效果,分桶和mapredue中的分区是一样的道理,所以我们要借助中间表导入数据。

7. hive中分区可以提高查询效率,分区是否越多越好,为什么?

1.hive如果有过多的分区,由于底层是存储在HDFS上,HDFS上只用于存储大文件 而非小文件,因为过多的分区会增加namenode的负担。

2.hive会转化为mapreduce,mapreduce会转化为多个task。过多小文件的话,每个文件一个task,每个task一个JVM实例,JVM的开启与销毁会降低系统效率。

注意:合理的分区不应该有过多的分区和文件目录,并且每个目录下的文件应该足够大

8.order by,sort by,distribute by,cluster by的区别?

order by会对所给的全部数据进行全局排序 ,不管来多少数据,都只启动一个reducer来处理 。

sort by是局部排序 ,sort by会根据数据量的大小启动一到多个reducer来干活,并且,它会在进入reduce之前为每个reducer都产生一个排序文件 。

distribute by 控制map结果的分发,它会将具有相同字段的map输出分发到一个reduce节点上做处理 。

cluster by 可以理解为一个特殊的distribute by和sort by的结合,当distribute by和sort by后面所跟的列名相同时,就等同于直接使用cluster by 跟上该列名。但是被cluster by指定的列最终的排序结果只能是降序,而且无法指定asc和desc。
Hive要求 distribute by 语句要写在 sort by 语句之前

9.sql的执行顺序

了解SQL语句执行顺序有助于减少SQL错误书写以及提高SQL执行效率,常用的SQL语句如下:

SELECT group_by_list,SUM(list),COUNT(list)
FROM <table1> JOIN < table2> ON < join_condition>
WHERE < where_condition>
GROUP BY < group_by_list>
HAVING < having_condition>
ORDER BY < order_by_list>

标准的SQL 的解析顺序为:
(1)FROM 子句 组装来自不同数据源的数据
(2)join
(3)on
(4)WHERE 子句 基于指定的条件对记录进行筛选
(5)GROUP BY 子句 将数据划分为多个分组
(6)使用聚合函数进行计算
(7)使用HAVING子句筛选分组
(8)计算所有的表达式
(9)使用ORDER BY对结果集进行排序
(10)limit

想要了解更多Hive的知识,推荐阅读以下文章:
Hive使用必知必会系列
hive相关知识点总结(包括基本语法,文章超级详细)
大数据分析工程师面试集锦3-SQL/SparkSql/HiveQL
以后千万别面试卡壳 | Hive调优的12种方式
Hadoop 生态之 MapReduce 及 Hive 简介
一文总结HIVE在企业中最常用的知识点
如果连接过期了,请复制标题直接去搜狗搜索搜微信文章。

你可能感兴趣的:(SQL,#,Hive,sql,hive)