Hive
数据仓库
数据仓库面向决策、支持分析的平台。数据仓库本身不存储数据,通过ETL任务,将已有的数据进行分析,得到结果,然后被其他业务系统消费。
OLTP & OLAP
OLTP | OLAP | |
---|---|---|
数据源 | 仅包含当前运行业务数据 | 整合来自多个数据源的数据,包括OLAP和外部来源 |
目的 | 面向应用,面向业务,支撑事务 | 面向主题,面向分析,支撑分析决策 |
焦点 | 当下 | 当下(实时数仓)以及过去(离线数仓) |
任务 | 读写操作 | 大量读而很少写的操作 |
响应时间 | 毫秒 | 秒、分钟、小时或者天 |
任务 | MB,GB | PB,EB |
数据库是为了捕获数据而设计的,数据仓库是为了分析数据而设计的。
特点
- 面向主题
- 集成性
- 非易失性
- 时变性
ETL & ELT
- E(提取)
- T(转换)
- L(加载)
数仓分层
层次 | 特点 |
---|---|
ODS | 数据引入:引入数据源 |
DW | 数据仓库层:数据加工和整合 |
DA | 数据应用层 |
分层的好处:
- 把复杂问题简单化
- 屏蔽原始数据的影响
Hive
Apache Hive是建立在Hadoop之上的开源数据仓库系统。
- Hive核心是将HQL转换为MapReduce程序 ,然后将程序提交到Hadoop集群执行;
- Facebook实现并开源
重点理解
- Hive能将数据映射成一张表,这个映射是指什么?
文件和表的对应关系 - Hive软件本身到底承担了什么功能职责?
SQL语法解析和编译成MR程序
数据存储
元数据存储在关系型数据库中;
数据存储在HDFS中。
数据类型
隐式数据转换和显式数据转换(CAST)
- 原生数据类型:Int Double Date TimeStamp String
- 复杂数据类型:Array Map Struct Union
Hive读写文件的机制
SerDe:
- Serde是Serializer和Deserializer和简称
- 序列化是将对象序列化为字节码的过程,而反序列化是将字节码反序列化为对象
内部表&外部表
内部表 | 外部表 | |
---|---|---|
创建方式 | 默认 | external |
Hive管理范围 | 元数据、表数据 | 元数据 |
删除表结果 | 删除元数据,删除HDFS上文件数据 | 只会删除元数据 |
操作 | 支持archive,unarchive,truncate,merge,concatenate | 不支持 |
事务 | 支持ACID/事务性 | 不支持 |
缓存 | 支持结果缓存 | 不支持 |
分区表
分区字段不能是表中存在的字段
静态分区 | 多重分区 | 动态分区 | |
---|---|---|---|
特点 | 分区的属性是由用户在加载数据时手动指定,load参数用于指定待加载的数据位于本地文件系统还是HDFS系统 | 分区之间是一种递进的关系,从HDFS角度下是子文件夹下再划分子文件夹 | 分区的字段是基于查询结果(参数位置)自动推断。核心语法是insert+select |
示例 |
事务
数据流的摄取。许多用户使用Apache Flume、Apache Storm或Apache Kafka等工具将数据流导入Hadoop集群。这些工具可以以每秒数百行或更多的速度写入数据,而Hive只能每15分钟到1小时增加一个分区。更频繁地添加分区会很快导致表中出现大量分区。这些工具可以将数据流到现有的分区中,但这会导致读取器脏读(也就是说,他们会在开始查询之后看到写入的数据),并在他们的目录中留下许多小文件,这会给NameNode带来压力。有了这个新功能,将支持这个用例,同时允许读者获得一致的数据视图,并避免过多的文件。
缓慢变化维度。在典型的星型模式数据仓库中,维度表会随着时间缓慢更改。例如,零售商将开设新的商店,这些商店需要添加到stores表中,或者现有的商店可能会更改其面积或其他一些可跟踪的特征。这些更改将导致插入单个记录或更新记录(取决于所选择的策略)。从0.14开始,Hive就能够支持这个功能。
数据重述。有时收集的数据被发现是不正确的,需要纠正。或者第一个数据实例可能是一个近似值(90%的服务器报告),稍后提供完整的数据。或者业务规则可能要求由于后续交易而重新申明某些交易(例如,在购买之后,客户可能会购买会员资格,因此有权享受折扣价格,包括之前的购买)。或者,根据合同,用户可能被要求在客户关系终止时删除他们的数据。从Hive 0.14开始,这些用例可以通过插入、更新和删除来支持。
视图
Hive中的视图是一种虚拟表,只保存定义,不实际存储数据。视图是用来简化操作的,不缓冲记录,也没有提高查询性能。
物化视图
- Hive3.0引入,提供对于物化视图的查询自动重写机制
- 物化视图存储选择机制:(1)本地存储在Hive(2)自定义storage handlers
- 优化数据查询访问效率,相当于从数据预处理的角度优化数据访问。
查询重写机制
语法
ORDER BY & CLUSTER BY & DISTRIBUTE BY
6种join方式
运算符
show functions # 展示所有的运算符
describe function func # 运算符信息
describe function extend func # 运算符更加详细的信息
空表
dual
UDF
- UDF:普通函数,一进一出
- UDAF:聚合函数,多进一出
- UDTF:建表函数,一进多出
java_method、reflect可以调用Java中的函数
explode
输入一行数据,转为多行数据输出。可以将输入数据中的数据转为多行数据输出。
- 只支持Array和Map
- 常和lateral view配合使用
处理多字节分隔符
- 替换分隔符
- 正则加载RegexSerde(推荐)
- 自定义InputFormat
MR属性优化
- 小任务本地执行
- JVM重用
- 并行执行
Join优化
- Map Join:小表join大标
- Reduce Join: 大表join大表
- Bucket Join:大表join大表优化方案
执行优化
- 关联优化
set hive.optimize.correlation=true
- CBO优化器
- 谓词下推
数据倾斜
数据倾斜-Group
- Map端聚合
- 随机分区
- 数据倾斜自动负载均衡
数据倾斜-Join - 提前过滤,将大数据变为小数据,实现Map Join
- 使用Bucket Join
- Skew Join