Hive 基于hadoop来构建数仓的工具(四) 概念及原理介绍

数据建模

  • 功能: 为数仓中每一层的数据表设计数据结构

  • 意义:

  • 解决问题: 每张表有哪些字段,表的结构怎么设计

  • 类型:

    1. ER关系实体模型: 传统的网站或者基于数据库的设计一般都用ER模型,侧重于实体和关系
      实体:整个业务中出现的实体
      属性:每个实体都对应有属性
      关系:实体之间存在的关系

    2. 维度模型: 基于不同的角度来描述一个事实,主要用于数仓设计中,侧重于分析,只要有利于分析都可以去做,所有的分析都基于维度,不同的维度分析结果不一样。不使用分区

      • 维度: 每个维度是一张表,
        如果事实表已经存在,维度表的建立基于事实表的数据,如果事实表新建,则事实表字段需要包含维 度表主键
      • 事实: 事实也是一张表,通过不同维度下的数值来量化这个事实,一个事件就是一条数据

      2-1. 星形模型:所有维度全部关联事实表,多级不存在子维度问题,符合数仓设计,不需要考虑三范式,列式 存储,用空间换时间,允许数据存储冗余,加快分析速度,企业前期的适用模型
      2-2. 雪花模型: 多级子维度通过外键关联父维度,用于关系型数据库,需要外键,符合数据库设计三范式
      存在问题:如果需要描述一个事实,维度中引用了多级外键,在进行数据检索时需要逐级检索,效率慢,企业中应避免使用这种模型
      2-3.星座模型:多个事实表可以共用相同的维度表,企业中后期适用模型

ETL

  • 概念: 数据的抽取,转换,加载的过程,一般用来过滤,补全,格式化数据,因其不涉及聚合过程,所以一般用maptask就能完成,不需要shuffle和reducetask
  • 意义: 各个子业务系统的数据进入数据仓库时,由于各个子业务系统数据的独立性,分散性,异构性等特点,需要进行统一的处理和综合,保证进入数仓的数据具有企业一致性,这个处理和综合的过程就叫做etl数据清洗
    e.g: 数据字段的处理,字长,单位,意义,名称等,
  • 一般步骤:
    过滤: 过滤不必要或无意义字段和数据
    转换: 转换数据格式和计量单位等
    补全: 将缺省值以默认值补全或解析字段值补全

行列转换

  • 多行转单列
    1. 内置函数
      1. 拼接:concat_ws(参数1,参数2):参数1指定分隔符,参数2指定拼接字段
      2. 使用array:collect_set(col):将col字段的值进行去重汇总,产生array类型的字段,如果不想去重 用collect_list(col)
  • 单列转多行
    1. 表生成函数:explode()
  • 多行转多列
    1. 使用case when then else end 加聚合函数来实现逻辑判断
  • 补充:
    1. union: 用于行的拼接,但是要求字段个数是一致的,会去重
    2. union all:用于行的拼接,要求字段个数和类型都是一致的,不会去重
    3. concact: 用于字符串拼接,但是不能指定分隔符,当出现一个null时,结果都为null
    4. concact_ws: 用于字符串拼接,可以指定分隔符,当出现null时,忽略null

Json解析

  1. 导入之前:将json对象拆成各个字段,再进行导入
    get_json_object:解析json数据,返回对应的数据
  2. 导入之后:将json以字符串方式用udf进行解析,
    json_tuple:UDTF函数,从json字符串中获取json对象
  3. 通过专门的解析类直接加载一个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分组,就容易产生数据倾斜

  • 解决:

    1. 如果是join产生的数据倾斜,启用mapjoin,先去重,做数据裁剪,去重之后再join或者过滤掉不必要字段
    2. 如果是group by/distinct产生的数据倾斜,开启map端聚合,即combiner,做了两次mr,第一次mr会进行随机分区,进行第一次局部聚合,第二个mr会进行hash分区,进行整体聚合

Hive的调优

  • 概括: 可从三个方面来解决,参数配置,sql执行,原理机制

参数配置

  1. 压缩算法:减少网络传输和磁盘存储以及cpu负荷,参考mapreduce压缩
  2. 存储格式:通过改变存储文件方式,减少hdfs存储,减少maptask个数
  3. 抓取机制:hive执行sql慢的原因是因为将sql转换为mr程序执行,通过fetch抓取机制,可以不使用mapreduce计算,minimal/more两种模式,在minimal模式下,* 和对分区过滤不走mr; 在more模式下,简单的 sql语句(不含聚合,分组,排序等),字段过滤,limit,都不走mr;
  4. 本地化:hive底层是将sql转换为mr程序提交到yarn上执行的,yarn执行有三种模式,设置hive自动启动本地模式,将会根据total数据是否小于128m,map 任务是否小于 4个,reduce task 是否为0或1;来判断是否开启本地模式
  5. 严格模式: 开启严格模式,
    1. 不允许扫描所有分区,除非指定分区字段,否则不允许执行
    2. order by是全局排序,必须指定limit,不允许全表扫描,将所有数据放到一个reducetask执行
    3. on会在where之前执行,一般数据库会将where转换为on,但是hive没有这种优化,避免笛卡尔积查询,即在关联查询时尽量使用on,避免使用where
    4. 不允许执行分区表不指定分区过滤
    5. 不允许将bigint类型与字符串\浮点型类型比较

SQL执行

  1. 拆分任务:将多个表关联的大sql拆分成小片段sql执行,

  2. 使用map join: 若不指定map join 或者不符合map join 条件,hive的解析器将会将操作转换为reduce join,容易发生数据倾斜,增加reduce task 的负载;大小表阈值设置

  3. SMB join: 大表join大表的优化,数据异常导致发生数据倾斜,容易造成热点问题,空key过滤,空key转换为随 机数

  4. map端聚合: 类似于mr的combine操作,避免分组时数据倾斜,将一部分聚合操作放在map端

  5. 执行计划: sql执行计划

  6. 关联问题: 两表关联数据时,采用合适的join来实现,map join,reduce join,smb join

  7. 分区裁剪: 如果做了分区表,在对表进行分析处理时,尽量加上分区字段进行过滤,先过滤,后处理

  8. 列裁剪: 如果需要处理数据时,先将不需要用到的列过滤掉,然后再处理,即指定处理字段

原理机制

  1. 并行执行机制: 开启任务并行,使得一个job的多个阶段由顺序执行变成并行执行
  2. jvm重用机制:hadoop通过派生jvm来执行map和reduce任务,每个任务启动一个jvm非常浪费资源和时间,jvm重用机制可以使得jvm实例在同一个job中重新使用n次;但是开启jvm重用将会一直占用资源,直到job 执行完毕才会释放
  3. 推测执行机制: 对拖后腿的任务进行执行备份任务,以先执行的成功的任务作为结果,一般不开启
  4. 数据倾斜问题: 为啥会造成数据倾斜问题?
    map优化:小而聚之,大而划之
    reduce优化:
  5. task个数问题: 默认reducetask个数是1个,maptask的个数和数据块,数据分片大小有关,建议根据数据量做采样测试,来确定maptask和reducetask的个数
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容