栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

Hive学习笔记总结

Hive学习笔记总结

Hive
    • Hive定义
    • Hive优缺点
    • Hive架构
    • Hive和数据库的区别
    • Hive元数据包括哪些,存在哪里?
    • Hive中的数据库
    • 建表语句
    • 内部表外部表区别
    • 往表中添加数据的5种方式
    • 往分区中添加数据的三种方式
    • 如何往分桶表添加数据
    • 分桶抽样查询
    • 窗口函数的操作
    • 窗口函数和分组的区别
    • 行转列,列转行
    • Order By、Sort By、Distribute By、Cluster By的用法区别
    • Hive的优化思路
    • hive如何解决数据倾斜

Hive定义

Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射成一张表,并提供类SQL查询功能。

由Facebook开源用于解决海量结构化日志的数据统计。

本质:将HQL转化成MapReduce程序。

存储-----Hive处理的数据储存在HDFS
计算-----Hive分析数据具有底层的实现是MapReduce
查询-----执行程序运行在Yarn上

Hive优缺点

优点

(1)操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)。
(2)避免了去写MapReduce,减少开发人员的学习成本。
(3)Hive的执行延迟比较高,因此Hive常用于数据分析,对实时性要求不高的场合。(4)Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执行延迟比较高。
(5)Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
缺点

1、Hive的HQL表达能力有限
(1)迭代式算法无法表达。
(2)数据挖掘方面不擅长,由于MapReduce数据处理流程的限制,效率更高的算法却无法实现。
2、Hive的效率比较低
(1)Hive自动生成的MapReduce作业,通常情况下不够智能化。
(2)Hive调优比较困难,粒度较粗。

Hive架构


1、用户接口:Client
CLI(command-line interface)、JDBC/ODBC(jdbc访问hive)、WEBUI(浏览器访问hive)。
2、元数据:metastore
元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;默认存储在自带的derby数据库中,推荐使用MySQL存储metastore。
3、Hadoop
使用HDFS进行存储,使用MapReduce进行计算。
4、驱动器:Driver
解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。
编译器(Physical Plan):将AST编译生成逻辑执行计划。
优化器(Query Optimizer):对逻辑执行计划进行优化。
执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark。

Hive和数据库的区别

1、查询语言
由于SQL被广泛的应用在数据仓库中,因此,专门针对Hive的特性设计了类SQL的查询语言HQL。熟悉SQL开发的开发者可以很方便的使用Hive进行开发。
2、数据存储位置
Hive 是建立在 Hadoop 之上的,所有 Hive 的数据都是存储在 HDFS 中的。而数据库则可以将数据保存在块设备或者本地文件系统中。
3、数据更新
由于Hive是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。因此,Hive中不建议对数据的改写,所有的数据都是在加载的时候确定好的。而数据库中的数据通常是需 要经常进行修改的,因此可以使用 INSERT INTO … VALUES 添加数据,使用 UPDATe … SET修改数据。
4、执行
Hive中大多数查询的执行是通过 Hadoop 提供的 MapReduce 来实现的。而数据库通常有自己的执行引擎。
5、执行延迟
Hive 在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高。另外一个导致 Hive 执行延迟高的因素是 MapReduce框架。由于MapReduce 本身具有较高的延迟, 因此在利用MapReduce 执行Hive查询时,也会有较高的延迟。相对的,数据库的执行延迟较低。当然,这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理 能力的时候,Hive的并行计算显然能体现出优势。
6、可扩展性
由于Hive是建立在Hadoop之上的,因此Hive的可扩展性是和Hadoop的可扩展性是一致的(世界上最大的Hadoop 集群在 Yahoo!,2009年的规模在4000 台节点左右)。而数据库由于 ACID 语义的严格限制,扩展行非常有限。目前最先进的并行数据库 Oracle 在理论上的扩展能力也只有100台左右。
7、数据规模
由于Hive建立在集群上并可以利用MapReduce进行并行计算,因此可以支持很大规模的数据;对应的,数据库可以支持的数据规模较小。

Hive元数据包括哪些,存在哪里?

元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;默认存储在自带的derby数据库中,推荐使用MySQL存储metastore。

Hive中的数据库

Hive中的数据类型

数据类型长度例子
TINYINT1byte有符号整数10
SMALINT2byte有符号整数10
INT4byte有符号整数10
BIGINT8byte有符号整数10
BOOLEAN布尔类型,true或者falseTRUE
FLOAT单精度浮点数1.0
DOUBLE双精度浮点数1.0
STRING字符串“abcd”
TIMESTAMP日期,时间戳或者字符串12345或者‘2020-01-01’
ARRAY一组有序字段,类型必须相同Array(1,2)
MAP一组无序的键值对Map(‘a’,1,'b’2)
STRUCT一组命名的字段,字段类型可以不同Struct(‘a’,1,1,0)

基本数据类型:TINYINT、SMALINT、INT、BIGINT、BOOLEAN、FLOAT、DOUBLE、STRING、TIMESTAMP、BINARY
复杂数据类型:STRUCT、MAP、ARRAY

Hive中默认的行和列分隔符

分隔符描述
n行分隔符
^A列分隔符
^BARRAY、MAP、STRUCT中元素之间的分隔符
^CMAP中的KEY和VALUE之间的分隔符
建表语句
CREATE TABLE IF NOT EXISTS teacher(
  id INT COMMENT '编号',
  name STRING COMMENT '名字'
)COMMENT'教师表'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ' '; 

内部表外部表区别

在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。

往表中添加数据的5种方式

1 向表中装载数据(Load)。

2 通过查询语句向表中插入数据(Insert)。

3 查询语句中创建表并加载数据(As Select)。

4 创建表时通过Location指定加载数据路径。

5 import数据到指定Hive表中。

往分区中添加数据的三种方式

创建文件夹后load数据到分区

上传数据后添加分区

上传数据后修复

如何往分桶表添加数据

先建立一个临时表,通过load data将TXT文本导入到临时表中,然后再在Hive中建立一个具有分桶结构的表,开启强制分桶,
使用insert、select 语句间接地把数据从临时表导入到分桶表中。

分桶抽样查询

对于非常大的数据集,有时用户需要使用的是一个具有代表性的查询结果而不是全部结果。Hive可以通过对表进行抽样来满足这个需求。

查询表stu_buck中的数据:hive (default)> select * from stu_buck tablesample(bucket 1 out of 4 on id);

窗口函数的操作

LEAD :返回当前行以下n行的指定列的列值

LAG: 返回当前行以上n行的指定列的列值

FIRST_VALUE:返回当前窗口指定列的第一个值

LAST_VALUE:返回当前窗口指定列的最后一个值

统计类函数:
COUNT、SUM、MIN、MAX、AVG

排名类函数:
RANK、ROW_NUMBER、DENSE_RANK、CUME_DIST、PERCENT_RANK、NTILE(x):将数据集平均分到x个组里面,返回每条记录所在的组号。

窗口函数和分组的区别

如果是分组操作,select后面只能跟分组后的字段,或者是聚合函数。

如果是窗口函数,窗口函数在指定的窗口内,对每条记录都做一次计算。

如果是分组操作,会有去重的效果,但是partition不会去重。

行转列,列转行

行转列
CONCAt(string A/col, string B/col…):返回输入字符串连接后的结果,支持任意个输入字符串;

CONCAT_Ws(separator, str1, str2,…):它是一个特殊形式的 CONCAt()。第一个参数剩余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间;

COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段。

列转行
EXPLODE(col):将hive一列中复杂的array或者map结构拆分成多行。

LATERAL VIEW
用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias

Order By、Sort By、Distribute By、Cluster By的用法区别

Order By
全局排序,只有一个Reducer
1、使用 ORDER BY 子句排序
ASC(ascend): 升序(默认)
DESC(descend): 降序
2、ORDER BY 子句在SELECT语句的结尾。

Sort By
对于大规模的数据集order by的效率非常低。在很多情况下,并不需要全局排序,此时可以使用sort by。

Distribute By
在有些情况下,我们需要控制某个特定行应该到哪个reducer,通常是为了进行后续的聚集操作。distribute by 子句可以做这件事。distribute by类似MR中partition(自定义分区),进行分区,结合sort by使用。

Cluster by
当distribute by和sorts by字段相同时,可以使用cluster by方式。
cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是升序排序,不能指定排序规则为ASC或者DESC。

Hive的优化思路

1、MapJoin
MapJion就是在Map阶段进行表之间的连接。而不需要进入到Reduce阶段才进行连接。这样就节省了在Shuffle阶段时要进行的大量数据传输。从而起到了优化作业的作用。

2、行列过滤
列处理:在SELECT中,只拿需要的列,如果有,尽量使用分区过滤,少用SELECT * 。
行处理:在分区剪裁中,当使用外关联时,如果将副表的过滤条件写在Where后面,那么就会先全表关联,之后再过滤。

3、列式存储
每一列单独存放,数据即是索引。
只访问涉及得到的,如果我们想访问单独一列(比如NAME)会相当迅速。一行数据包含一个列或者多个列,每一个列单独一个cell来存储数据。

4、采用分区技术
分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。分区表实际上对应一个HDFS文件系统上的文件夹,该文件夹下是该分区的数据文件。

5、合理设置Map数
1、复杂文件增加Map数,2、小文件进行合并
通常情况下,作业会通过input的目录产生一个或者多个map任务。
主要决定因素有:input的文件个数、input的文件大小、集群设置的文件大小。
如果一个任务有很多小文件(远远小于块(128m)大小),则每个小文件也会被当做一个块,用一个map任务来完成,而一个map任务启动和初始化的时间远远大于逻辑处理的时间,就会造成很大的资源浪费。而且,同时可执行的map数时受限的。

6、合理设置Reduce数
如果Reduce设置的过大,将会产生很多小文件,对NameNode会产生一定的影响,而且整个作业的运行时间未必会减少。
如果Reduce设置的过小,单个Reduce处理的数据将会加大,很可能会引起OOM(out of memory)异常。

7、压缩
时间换空间,空间换时间

hive如何解决数据倾斜

1、不同数据类型关联产生数据倾斜
2、控制空值分布
3、group by
4、mapjoin
5、开启数据倾斜时负载均衡

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/653800.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号