hive初识

HIVE的认识:

定义:

hive 是基于 hadoop 的数据仓库工具,将结构化的数据映射成一张表,提供sql查询功能,可以对数据提取,转化,加载,

简而言之:查询和分析存储在 hadoop大规模的数据工具,离线的大数据分析

hive在hadoop的生态圈

hive 将 存储在HDFS中的结构化数据文件 映射成 类似关系型数据库表,并接受 sql语句,将其转化为Mapreduce (切成单元,分布到各节点去数据处理)程序去执行, hive必须依赖hadoop而存在

hive的架构设计

  • hive 客户端 支持java python 连接 与RDBMS(关系型数据库)类似
  • hive服务端 客户端与hive交互,服务端主要包括 CLI(控制台命令行)、 HiveServer 、Hive web interface(port:9999)、Driver(执行去调用底层的MAPreduce计算框架)、metastore(元数据服务)等组件
  • hive存储与计算 hive元数据 使用RDBMS(关系型数据库)存储,hive数据存储在HDFS(分布式文件系统)中,大部分查询由mapreduce 完成

hive工作流程

​ 简而言之:Hive接到命令之后,首先会去元数据库获取元数据,然后把元数据信息和作业计划发送Hadoop集群执行任务,再将最终的结果返回。

hive适用场景

  • 延迟高,对实时性要求低的场合
  • 结构化数据 ,离线分析统计 的大数据场景

hive 存储格式

  • textfile 默认格式 压缩后Gzip 不再支持mapreduce分割机制
  • sequencefile 可分割的文件格式,追加存储 ,支持压缩
  • rcfile 面向列的数据存储格式
  • orcfile 对rcfile 的优化,文件可切割,支持多种索引

hive数据单元

无主键,不支持行级操作,不支持update操作,

  • 数据库 Database

  • 表 table(内表和外表)

  • 分区 partition

  • 分桶 Buckets or Clusters

    ——分区/分桶 提高查询性能。分区是将数据按照某个列的值进行分组,而桶是将数据按照哈希值进行分组

hive内部表和外部表区别:

1.未被external修饰的是内部表【managed table】,被external修饰的为外部表【external table】。

2.内部表数据由Hive自身管理,外部表数据由HDFS管理。

3.内部表数据存储在hive.metastore.warehouse.dir【默认:/user/hive/warehouse】,外部表数据存储位置由用户自己决定。

4.删除内部表会直接删除元数据【metadata】及存储数据,~ 删除外部表仅仅删除元数据,HDFS上的文件不会被删除。

5.对内部表的修改会直接同步到元数据,而对外部表的表结构和分区进行修改,则需要修改【MSCK REPAIR TABLE table_name】

基本数据类型

  • 整数 TINYINT,SMALLINT,INT,BIGINT
  • 小数 FLOAT和DOUBLE
  • 文本 BINARY用于存储变长的二进制数据
  • 布尔 BOOLEAN
  • 二进制
  • 时间 TIMESTAMP则存储纳秒级别的时间戳,同时Hive提供了一些内置函数用于在TIMESTAMP与Unix时间戳(秒)和字符串之间做转换。

复杂数据类型

  • array 数组 和map 映射

    • array 具有相同类型的变量的集合 数据格式[‘1’,‘2’,‘3’]
    • map 一组键值对组合 {'A':1,'B':'2'} key基本类型,值任意类型
  • struct 结构体 {‘A’:'2'} key和value 都是任意类型

  • uniontype 联合体

元数据 -hive客户端 连接metastore 服务 -完成访问数据库的元数据的存取

  • 元数据存储在RDBMS
    • single user mode
    • muti user mode
    • remote server mode

hive 语法

  • HQL 支持CTE,可将查询作为临时表共享使用
  • 支持嵌套子查询 无限制
  • 支持匹配正则 表达式 和虚拟列
  • union all 用于合并多个具有相同结构的结果集
    • 窗口函数:对数据进行实时分析处理,进一步细分分组结果
    • 解决排名问题,
    • 解决TOPN问题
    • 语法:
    • 注意:窗口函数是对where后者group by子句处理后的结果进行操作,因此按照SQL语句的运行顺序,窗口函数一般放在select子句中。
      • select 窗口函数 over (partition by 用于分组的列名, order by 用于排序的列名)
        • select
          uid,
          second_category,
          pay_money,
          sum(pay_money) over(partition by second_category order by pay_money desc ) from dwd_hq.dwd_order_detail
          where replace(substr(formal_date,1,10),'-','') >= '20230315' and replace(substr(formal_date,1,10),'-','') <= '20230325'
      • 排名函数:row_number(),rank(),dense_rank()
        • select
          uid,
          second_category,
          pay_money,
          rank() over(partition by second_category order by pay_money desc ) from dwd_hq.dwd_order_detail
          where replace(substr(formal_date,1,10),'-','') >= '20230315' and replace(substr(formal_date,1,10),'-','') <= '20230325'
      • 聚合函数:max(),min(),count(),sum(),avg(),median()
        • select sum(pay_money) from dwd_hq.dwd_order_detail where replace(substr(formal_date,1,10),'-','') >= '20230315' and replace(substr(formal_date,1,10),'-','') <= '20230325'
      • 向前向后取值:lag(),lead()
        百分位:percent_rank()
        取值函数:first_value(),last_value(),nth_value()
        分箱函数:ntile()
      • ***实例 ::: 神策用户-登录用户-7天内前三名(不同考试意向下)
      • select user_id from 神策 where time_id 7日内 group by exam order by create_time desc

数据倾斜(大数据常遇问题,尤其在分布式计算中最突出)

  • 定义:

    • 由于数据分布不均匀,造成数据大量的集中到一点,造成数据热点
  • 表现:

    • 任务进度长时间维持在 99%或者 100%的附近,查看任务监控页面,发现只有少量 reduce子任务未完成,因为其处理的数据量和其他的 reduce 差异过大。单一 reduce 处理的记录数和平均记录数相差太大,通常达到好几倍之多,最长时间远大于平均时长
  • 出现情况:

    • join 表小 集中在key
    • group by 维度小,某值得数量过多
    • count distinct 特殊值过多
  • 产生原因

    • A:key 分布不均匀

      B:业务数据本身的特性

      C:建表考虑不周全

      D:某些 HQL 语句本身就存在数据倾斜

  • 解决方案:XXX

数仓的分层架构

ETL

ODS层:贴源层,与业务库保持一致,不做任何处理
DWD层:明细层,对数据进行规范话化,转换清洗。
DWS层:对数据按维度进行汇总,降低业务需求
ADS层:应用层,面向业务需求开发。
分层的好处:
清晰数据结构
数据血缘追踪
减少重复开发
把复杂问题简单化

posted @ 2023-06-03 15:15  太白之魔童降世  阅读(23)  评论(0编辑  收藏  举报