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'
- select
- 排名函数: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'
- select
- 聚合函数: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
- select 窗口函数 over (partition by 用于分组的列名, order by 用于排序的列名)
数据倾斜(大数据常遇问题,尤其在分布式计算中最突出)
-
定义:
- 由于数据分布不均匀,造成数据大量的集中到一点,造成数据热点
-
表现:
- 任务进度长时间维持在 99%或者 100%的附近,查看任务监控页面,发现只有少量 reduce子任务未完成,因为其处理的数据量和其他的 reduce 差异过大。单一 reduce 处理的记录数和平均记录数相差太大,通常达到好几倍之多,最长时间远大于平均时长
-
出现情况:
- join 表小 集中在key
- group by 维度小,某值得数量过多
- count distinct 特殊值过多
-
产生原因
-
A:key 分布不均匀
B:业务数据本身的特性
C:建表考虑不周全
D:某些 HQL 语句本身就存在数据倾斜
-
-
解决方案:XXX
数仓的分层架构
ETL
ODS层:贴源层,与业务库保持一致,不做任何处理
DWD层:明细层,对数据进行规范话化,转换清洗。
DWS层:对数据按维度进行汇总,降低业务需求
ADS层:应用层,面向业务需求开发。
分层的好处:
清晰数据结构
数据血缘追踪
减少重复开发
把复杂问题简单化