hive基础学习

hive

hive的定义:

	Hive:是由Facebook开源用于解决海量结构化日志的数据统计。
	Hive是基于hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能,其本质是将HQL转化为MapReduce程序。
	Hive处理的数据存储在HDFS上,Hive分析数据的底层实现是MapReduce,执行程序运行在Yarn上

hive的优缺点:

优点:

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

缺点:

	1.Hive的HQL表达能力有限。
		迭代式算法无法表达(MapReduce本身就不支持)。
		数据挖掘方面不擅长。
	2.Hive的效率比较低。
		Hive自动生成的MapReduce作业,通常情况下不够智能化。
		Hive调优比较困难,粒度较粗。

hive架构

在这里插入图片描述

1.用户接口:Client

		CLI(hive shell)、JDBC/ODBC(Java访问hive)、WEBUI(浏览器访问hive)

2.元数据:Meta store

		Meta store(元数据存储)是一个独立的关系型数据库(通常是MySQL),hive会在其中保存表模式和其他系统元数据。

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数据类型

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

内部表与外部表的区别

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

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

1.向表中装载数据(Load)
2.通过查询语句向表中插入数据(Insert)
3.查询语句中创建表并加载数据(As Select)
4.创建表时通过Location指定加载数据路径
5.Import数据到指定Hive表中

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

创建文件夹后load数据到分区
上传数据后添加分区
上传数据后修复

标题窗口函数的操作

LEAD :返回当前行以下n行的指定列的列值				
LAG: 返回当前行以上n行的指定列的列值					
FIRST_VALUE:返回当前窗口指定列的第一个值				
LAST_VALUE:返回当前窗口指定列的最后一个值	

1.统计类函数:
	COUNT:个数统计函数
	SUM:总和统计函数
	MIN:最小值
	MAX:最大值
	AVG:平均值

2.排名类函数:
	RANK:值相同时,名次会重复,总数不变
	ROW_NUMBER:值相同时,名次按照顺序不重复,总数不变
	DENSE_RANK:值相同时,名次会重复,总数变少
	CUME_DIST:如果按升序排列,则统计:小于等于当前值的行数/总行数。如果是降序排列,则统计:大于等于当前值的行数/总行数。
	NTILE(x):将数据集平均分到x个组里面,返回每条记录所在的组号

窗口函数和分组的区别:

1.如果是分组操作,select后面只能跟分组后的字段,或者是聚合函数
2.如果是窗口函数,窗口函数在指定的窗口内,对每条记录都做一次计算
3.如果是分组操作,会有去重的效果,但是partition不会去重

行转列

CONCAT(string A/col, string B/col…):返回输入字符串连接后的结果,支持任意个输入字符串;
CONCAT_WS(separator, str1, str2,...):它是一个特殊形式的 CONCAT()。第一个参数剩余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。
如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间;
COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段。

列转行

XPLODE(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
	首先在本地生成一个local task 读取比较小的表dept,然后将表写入Hash Table Files ,上传到HDFS的缓存中,然后启动一个map作业,每读取一条数据,就与缓存中的小表进行join操作,直至整个大表读取结束。
	MAPJION会把小表全部读入内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配,由于在map是进行了join操作,省去了shullfe和reduce运行的效率也会高很多
2.行列过滤
	列处理:在SELECT中,只拿需要的列,如果有,尽量使用分区过滤,少用SELECT
	行处理:在分区剪裁中,当使用外关联时,如果将副表的过滤条件写在Where后面,那么就会先全表关联,之后再过滤
3.列式存储
列式存储是在hdfs上是按照列进行存储,一个block可能有一列或多列数据。
列式存储 需要查询的数据量小,效率高,压缩性能强
4.采用分区技术
5.合理设置Map数	
6.合理设置Reduce数
7.压缩

hive如何解决数据倾斜

1.不同数据类型关联产生数据倾斜
	默认的Hash操作会按int型的id来进行分配,这样会导致所有string类型id的记录都分配到一个Reducer中。
	解决方法:把数字类型转换成字符串类型
2.控制空值分布
	将为空的key转变为字符串加随机数或纯随机数,将因空值而造成倾斜的数据分不到多个Reducer。
3.group by
4.map join
5.开启数据倾斜时负载均衡
	就是先随机分发并处理,再按照 key group by 来分发处理。
	当选项设定为 true,生成的查询计划会有两个 MRJob。
	第一个 MRJob 中,Map 的输出结果集合会随机分布到 Reduce 中,每个 Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同的 GroupBy Key 有可能被分发到不同的Reduce 中,从而达到负载均衡的目的;
	第二个 MRJob 再根据预处理的数据结果按照 GroupBy Key 分布到 Reduce 中(这个过程可以保证相同的原始 GroupBy Key 被分布到同一个 Reduce 中),最后完成最终的聚合操作。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值