数据建模
功能: 为数仓中每一层的数据表设计数据结构
意义:
解决问题: 每张表有哪些字段,表的结构怎么设计
-
类型:
ER关系实体模型: 传统的网站或者基于数据库的设计一般都用ER模型,侧重于实体和关系
实体:整个业务中出现的实体
属性:每个实体都对应有属性
关系:实体之间存在的关系-
维度模型: 基于不同的角度来描述一个事实,主要用于数仓设计中,侧重于分析,只要有利于分析都可以去做,所有的分析都基于维度,不同的维度分析结果不一样。不使用分区
- 维度: 每个维度是一张表,
如果事实表已经存在,维度表的建立基于事实表的数据,如果事实表新建,则事实表字段需要包含维 度表主键 - 事实: 事实也是一张表,通过不同维度下的数值来量化这个事实,一个事件就是一条数据
2-1. 星形模型:所有维度全部关联事实表,多级不存在子维度问题,符合数仓设计,不需要考虑三范式,列式 存储,用空间换时间,允许数据存储冗余,加快分析速度,企业前期的适用模型
2-2. 雪花模型: 多级子维度通过外键关联父维度,用于关系型数据库,需要外键,符合数据库设计三范式
存在问题:如果需要描述一个事实,维度中引用了多级外键,在进行数据检索时需要逐级检索,效率慢,企业中应避免使用这种模型
2-3.星座模型:多个事实表可以共用相同的维度表,企业中后期适用模型 - 维度: 每个维度是一张表,
ETL
- 概念: 数据的抽取,转换,加载的过程,一般用来过滤,补全,格式化数据,因其不涉及聚合过程,所以一般用maptask就能完成,不需要shuffle和reducetask
- 意义: 各个子业务系统的数据进入数据仓库时,由于各个子业务系统数据的独立性,分散性,异构性等特点,需要进行统一的处理和综合,保证进入数仓的数据具有企业一致性,这个处理和综合的过程就叫做etl数据清洗
e.g: 数据字段的处理,字长,单位,意义,名称等, - 一般步骤:
过滤: 过滤不必要或无意义字段和数据
转换: 转换数据格式和计量单位等
补全: 将缺省值以默认值补全或解析字段值补全
行列转换
- 多行转单列
- 内置函数
- 拼接:concat_ws(参数1,参数2):参数1指定分隔符,参数2指定拼接字段
- 使用array:collect_set(col):将col字段的值进行去重汇总,产生array类型的字段,如果不想去重 用collect_list(col)
- 内置函数
- 单列转多行
- 表生成函数:explode()
- 多行转多列
- 使用case when then else end 加聚合函数来实现逻辑判断
- 补充:
- union: 用于行的拼接,但是要求字段个数是一致的,会去重
- union all:用于行的拼接,要求字段个数和类型都是一致的,不会去重
- concact: 用于字符串拼接,但是不能指定分隔符,当出现一个null时,结果都为null
- concact_ws: 用于字符串拼接,可以指定分隔符,当出现null时,忽略null
Json解析
- 导入之前:将json对象拆成各个字段,再进行导入
get_json_object:解析json数据,返回对应的数据 - 导入之后:将json以字符串方式用udf进行解析,
json_tuple:UDTF函数,从json字符串中获取json对象 - 通过专门的解析类直接加载一个json格式的数据到Hive中,在加载数据时就解析json对象,类似于正则加载
json-serde-1.3.7-jar-with-dependencies.jar;
数据类型
概念: hive中的数据类型即支持sql类型也支持java类型,还支持复杂类型array,map
字符: string
时间: date,timestamp
数字:
布尔:
补充:
array类型取数值可以直接去下标,array[index]
map类型取数值需要根据key去取,map[key]
宽表和窄表
- 意义: 一般出现在DWD层,针对ods层的数据做进一步补全, olap中不遵循数据库三范式,所以字段可以再分,即一个字段可能糅杂了多个属性在一起,每次分析需要先做字段拆分,不利于分析
- 概念: 为了分析方便,把糅杂在一起的多属性字段属性提取出来,拆分为多个字段,或者将多数据源之间数据字段的关联,字段个数变多,新表就称之为宽表,之前的旧表称之为窄表,宽表也叫明细表,窄表也叫原始表
- 窄表:严格按照数据库设计三范式。尽量减少数据冗余,但是缺点是修改一个数据可能需要修改多张表。
宽表:从字面意义上讲就是字段比较多的数据库表。通常是指业务主题相关的指标、维度、属性关联在一起的一张数据库表。
数据库和数据仓库的区别
- 数据库: oltp 操作型处理 实时 侧重事务 面向应用 面向业务 支持业务流程 避免冗余
- 数据仓库: olap 分析型处理 历史 侧重分析 面向分析 面向主题 支持决策 引入冗余
分组和分区的区别
- 分组: group by 每个分组只返回一条数据,一般和聚合函数连用
- 分区: partition by 将数据按照规则划分,原来多少条,输出还是多少条
Hive特殊分隔符处理
背景知识:
hive读取数据的机制:
1. 首先用inputformat(默认textinputformat)的一个具体实现类读入文件数据,返回一条条的记录。
2. 然后利用serde(默认lazysimpleserde)的一个具体实现类,对上面一条条记录进行字段切割应用场景:
hive中指定分隔符默认情况下只支持单字节分隔符,如果出现多字节的分隔符,就需要使用此场景解决办法: 通过正则表达式匹配,通过属性分隔符指定,参见DDL,分隔符指定
create table
...
with serdeproperties(
'input.regex'='(.*)\\|\\|(.*)',
'output.format.string'='%1$s %2$s'
)
侧视图
- 概念: 一种特殊的表,只读的表叫视图,为了数据安全,逻辑表,没有数据,数据来源于映射别的表,视图是临时的存在内存中,当用完之后就会销毁,下次使用时自动再构建一次,
- 补充:侧视图一般与udtf连用,将udtf的结果变成一个视图
hive中的数据倾斜
sql语句中容易发生数据倾斜的语句:
join,group by,count(distinct),
只要会经过shuffle分组,就容易产生数据倾斜-
解决:
- 如果是join产生的数据倾斜,启用mapjoin,先去重,做数据裁剪,去重之后再join或者过滤掉不必要字段
- 如果是group by/distinct产生的数据倾斜,开启map端聚合,即combiner,做了两次mr,第一次mr会进行随机分区,进行第一次局部聚合,第二个mr会进行hash分区,进行整体聚合
Hive的调优
- 概括: 可从三个方面来解决,参数配置,sql执行,原理机制
参数配置
- 压缩算法:减少网络传输和磁盘存储以及cpu负荷,参考mapreduce压缩
- 存储格式:通过改变存储文件方式,减少hdfs存储,减少maptask个数
- 抓取机制:hive执行sql慢的原因是因为将sql转换为mr程序执行,通过fetch抓取机制,可以不使用mapreduce计算,minimal/more两种模式,在minimal模式下,* 和对分区过滤不走mr; 在more模式下,简单的 sql语句(不含聚合,分组,排序等),字段过滤,limit,都不走mr;
- 本地化:hive底层是将sql转换为mr程序提交到yarn上执行的,yarn执行有三种模式,设置hive自动启动本地模式,将会根据total数据是否小于128m,map 任务是否小于 4个,reduce task 是否为0或1;来判断是否开启本地模式
- 严格模式: 开启严格模式,
1. 不允许扫描所有分区,除非指定分区字段,否则不允许执行
2. order by是全局排序,必须指定limit,不允许全表扫描,将所有数据放到一个reducetask执行
3. on会在where之前执行,一般数据库会将where转换为on,但是hive没有这种优化,避免笛卡尔积查询,即在关联查询时尽量使用on,避免使用where
4. 不允许执行分区表不指定分区过滤
5. 不允许将bigint类型与字符串\浮点型类型比较
SQL执行
拆分任务:将多个表关联的大sql拆分成小片段sql执行,
使用map join: 若不指定map join 或者不符合map join 条件,hive的解析器将会将操作转换为reduce join,容易发生数据倾斜,增加reduce task 的负载;大小表阈值设置
SMB join: 大表join大表的优化,数据异常导致发生数据倾斜,容易造成热点问题,空key过滤,空key转换为随 机数
map端聚合: 类似于mr的combine操作,避免分组时数据倾斜,将一部分聚合操作放在map端
执行计划: sql执行计划
关联问题: 两表关联数据时,采用合适的join来实现,map join,reduce join,smb join
分区裁剪: 如果做了分区表,在对表进行分析处理时,尽量加上分区字段进行过滤,先过滤,后处理
列裁剪: 如果需要处理数据时,先将不需要用到的列过滤掉,然后再处理,即指定处理字段
原理机制
- 并行执行机制: 开启任务并行,使得一个job的多个阶段由顺序执行变成并行执行
- jvm重用机制:hadoop通过派生jvm来执行map和reduce任务,每个任务启动一个jvm非常浪费资源和时间,jvm重用机制可以使得jvm实例在同一个job中重新使用n次;但是开启jvm重用将会一直占用资源,直到job 执行完毕才会释放
- 推测执行机制: 对拖后腿的任务进行执行备份任务,以先执行的成功的任务作为结果,一般不开启
- 数据倾斜问题: 为啥会造成数据倾斜问题?
map优化:小而聚之,大而划之
reduce优化: - task个数问题: 默认reducetask个数是1个,maptask的个数和数据块,数据分片大小有关,建议根据数据量做采样测试,来确定maptask和reducetask的个数