当前位置:   article > 正文

Hive详解、配置、数据结构、Hive CLI

hive cli

一、Hive 认识

1. Hive 应用
问题:公司的经营状况?
主题一:财务
	现金流
		指标1.1:净现金流入/流出量
		指标1.2:现金转换周期
	预算执行状况
		指标2.1:预算内成本控制
		指标2.2:预算与实际支出的差异
主题二:产品
		指标1:产品销售量
		指标2:产品利润率
		指标3:新产品开发周期
主题三:客户
	老客户的流失率
		指标1.1:重复购买率
		指标1.2:客户满意度调查结果
	新客户的留存率、转化率
		指标2.1:新客户留存率
		指标2.2:潜在客户到实际客户的转化率
主题四:员工
		指标1:员工满意度
		指标2:员工流失率
		指标3:员工绩效评估
主题五:资产
		指标1:资产负债率
		指标2:固定资产周转率
		指标3:存货周转率
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

问题 => 主题(拆分) => 指标 => HQL

2. Hive 定义

基于元数据表数据对数据进行结构化治理的机制(数仓)
在这里插入图片描述
"基于元数据"的核心:获取Hive MetaStore指定Mysql存储的元数据并根据其解析HQL生成执行计划
"基于表数据"的核心:获取表数据并通过执行计划进行数据处理和结果存储和加载。

3. Hive 具体设计

在这里插入图片描述

关键组件

UI:客户端提交查询。
Compiler:借助MetaStore获取存储在Mysql中的元数据信息解析查询块或表达式,生成执行计划。
Execution engine:管理计划的不同阶段之间的依赖关系(协调各操作的执行顺序),并在适当的大数据组件上执行这些阶段。

关键步骤详解

6.1步:
1.将执行计划提交到Hadoop作为一个MapReduce作业.
2.RM将作业分解为多个任务,并且分配给不同的集群节点去执行。
3.启动Map任务(读取输入数据,处理,输出结果)
4.启动Reduce任务(可选)(读取Map|Shffle端输出,处理,输出结果) => 决定了是MapOnly引擎还是MapReduce引擎
6.2步:
完成了一个Job,将数据加载到Hive表上。
6.3步:
Hive与HDFS进行交互,包括读取数据文件以进行查询,或将查询结果写入到HDFS。
7,8,9步:
一旦执行引擎完成了查询任务,结果需要被传回UI
体现了将查询结果有执行引擎处理并通过Hive驱动程序返回给用户界面的过程。

执行计划的变化过程

在这里插入图片描述

二、ETL——数仓构建核心环节

定义

将数据从各种数据源中提取出来,经过一系列处理和转换,最后导入到Hive委托存储的地方(例如:HDFS,Mysql等)

详解
Extract
​			从外部数据源读取不同数据格式(结构化,半结构化,非结构化)数据通过UI提交到Hive系统
​			如何从关系型数据库处拉取数据到近源层,使用JDBC技术写SQL语句:
			`SELECT 字段列表 FROM A JOIN B JOIN C WHERE ...`
			对于非关系型数据或其它格式的数据需要考虑其他方案。
			
		Transform(+宽表)									
​			列裁剪:使用 INSERT INTO ... SELECT 语句创建新表或视图。			
​			数据清洗:移除无用或错误数据。									
​			数据补全:修正残缺或错误数据。如 mlae 视为 male。				province  city					
​			数据变形:改变数据的格式。如 {province:Jiangsu, city:wuxi} 转为 Jiangsu | wuxi。										
​			无法修正错误:删除记录或视为缺失后估算。如年龄 -3。	
	​		数据集大小对处理要求的影响
	​			大数据集:尽量近似和估算
	​			小数据集:尽量补全		
		​Load
​			1. 将数据从DM层或者直接从源头加载到HDFS中。
​			2. 将物理计划传递给执行引擎,如MapReduce。
​			3. 获取处理后的结果或将处理后的结果写入HDFS。

		ODS 近源层(`外部表`)
​			Extract后提取到的保持原始格式的数据被提取到ODS层,并在ODS层内经过一定的清洗和结构化。
​		
​		DWD 明细层(`内部表`)
​			表合并(列),行不变

			时间维度表
			订单表				=> pro_dwd.order_detail_by_date
			订单详情表
			
			省份表
			城市表
			店铺表				=> pro_dwd.order_detail_by_add_shop
			订单表
			订单详情表

​		DWT	轻聚层	
			1.实现聚合操作
				聚合操作包括对多个指标(如销售额、用户数等)在多个维度(如时间、地区、产品类别等)上进行统计汇总。
			2.提取聚合需求共性
​			
​		DWS 汇总层
​			指标对应的结果数据
​			
​		DM 	数据集市
​			涉及权限管理和权限申请,不同人看到不同权限的数据,也可以申请查看某份数据的权限。
​			
		## 如何理解在ODS上创建的是外部表,在DWD上创建的是内部表。
		外部表的数据实际存储在外部系统(如HDFS)上,内部表的数据存储是由Hive管理的。
		这是因为ODS层存储的原始数据还可能被其他应用所使用,而DWD层存储的经过转换、清洗和集成的数据专属于Hive。
​			
		关于"层"的概念:
		1. "层"是逻辑概念,表示一个数据处理|存储环节,实际上存储在不同的服务器中。
		2. "层"是基于数仓的概念,不依赖于任何引擎。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54

三、Hive 数据结构

(一)简介

1.存储位置

库、表的存储位置:

/user/hive/warehouse【即配置hive.metastore.warehouse.dir的文件夹路径地址】

默认数据库default非default数据库
数据库位置/user/hive/warehouse/数据库名字.db
表位置/user/hive/warehouse/表名/user/hive/warehouse/数据库名字.db/表名
2.类型

在这里插入图片描述
数据的存储位置:

服务
	Hive MetaStore:指定Derby|Mysql存储元数据信息,并与HDFS相关联。
					开放API面向客户端供它们访问元数据信息。			
存储
	database_params:存放元数据参数配置
	dbs:存放metadata元数据
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

(二)各数据类型详解

1.库:文件夹
2.表:文件夹
命名

内部表:hive_+含义
外部表:hive_ext_+含义
CTE|TEMPORARY TABLE|VIEW:含义|hive_tmp_+含义|hive_view_+含义
分区表|分桶表:hive_par_+含义

内部表与外部表

A.区别

内部表
​	1.HDFS中的数据由Hive管理,在Hive中删除表会同步删除数据。
​	2.在Hive中创建内部表之后,在HDFS中会自动创建内部映射路径:/hive312/warehouse/DB_NAME.db/TABLE_NAME
​	3.内部表在创建的时候,通常路径中还没有数据。
外部表
​	1.HDFS中的数据不由Hive管理,在Hive中删除表不会同步删除数据,要删数据必须去HDFS中手动删除。
​	2.在Hive中创建外部表之后,在HDFS中不会有内部映射路径,需要自行创建并指定location。(location为数据文件的上一级目录)
​	3.外部表在创建的时候,通常路径中已有数据。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

B.选择
只在Hive中使用;频繁更新数据并希望这些操作自动管理 —— 内部表
数据由多个应用共享,例如Hive和Spark;数据不经常变化或数据更新由外部过程管理 —— 外部表

3.分区:文件夹
定义

分区字段名=分区字段值
基于一个或多个分区键进行分区,通常以日期进行分区。
分区表为内部表。
分区字段可以是原始表中的字段,也可以是通过表中的一个或多个字段计算出来的表达式。(日期 -> 年)。
若非原始字段,其本身也可以作为原始字段使用所有的SQL语句。

如何选用分区字段?

1.WHERE … | ON …
2.GROUP BY … , DISTRIBUTE BY … (确定Reducer) , cluster by …(确定Reducer并在内部排序)
3.如果数据量大,由于分区本身(文件夹)的大小限制,会选择缩小分区字段的维度。

分类

1.静态分区(eg:客户按分区给数据)
需要为每个加载的数据集指定一个具体的分区(分区字段名=字段值)
适用于持续增长的新数据,例如对按月分区的数据,每个月增加一次分区即可。

2.动态分区(eg:项目初期,客户一次性给了大量数据)
适合处理包含大量分区的情况

作用

1.hive进行查询时就是文件流读文件,即使读一条数据也需要加载整个文件。
所以分区表将文件切割成更小的粒度,当需要针对局部数据进行检索、聚合等处理时,便于快速筛选出符合特定条件的数据,提高效率。
2.如果需要进行分组聚合的字段是分组字段,即直接对该分区作聚合,则直接设置combiner,无需设置reducer。

多级分区
GROUP BY year(order_time),month(order_time),weekofmonth(order_time)
	=>从左到右分区从主到次
一级分区(year=2012)
	二级分区(month=3)
		三级分区(weekofmonth=2)
  • 1
  • 2
  • 3
  • 4
  • 5
4.分桶:文件
定义

选择桶中的一个或多个列作为桶的依据,根据这些列的值对数据进行散列,然后根据散列值将数据分配到不同的桶中。
​ 分桶的字段必须是表中已存在的字段,分桶数通常为2^n
​ 默认采用原始字段值的hashcode%分桶数来决定该行数据会被拆分到几个桶。

目的

便于进行抽样,通过了解数据的分布状态来对数据进行全量分析。或者作为一部分数据集运行查询测试。
​ 提升有join操作时的MR效率

如何确定分桶数量?

主要由采样率决定 : 10% -> 桶数定义为10
​ 数据量越大,分桶越多。分桶越多,并行度越高。
​ 分区倾斜严重,分桶能缓解。

四、Hive的配置与优化

配置:											优先级			重要程度
set config_item=value;	临时配置			  1				✔✔✔(个性化 执行优化)
	set hive.server2.logging.operation.level=verbose|NONE; 开启|关闭日志(
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/939582
推荐阅读
相关标签