Skip to content

Commit e46e3e2

Browse files
committed
docs:Hive专栏概述
1 parent 44ffb9f commit e46e3e2

File tree

5 files changed

+154
-7
lines changed

5 files changed

+154
-7
lines changed

docs/.vuepress/config.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,8 @@ module.exports = {
169169
{
170170
text: 'Hive',
171171
items: [{
172-
text: '00-Hive执行原理',
173-
link: '/md/bigdata/轻松驾驭Hive数仓.md'
172+
text: 'Hive专栏概述',
173+
link: '/md/bigdata/Hive专栏概述.md'
174174
}, ]
175175
},
176176

@@ -492,10 +492,12 @@ module.exports = {
492492
collapsable: false,
493493
sidebarDepth: 0,
494494
children: [
495-
"01-macOS下 Hive 2.x 的安装与配置.md",
496-
"Hive执行原理.md",
497-
"Hive修复分区.md",
498-
495+
"Hive专栏概述",
496+
"Hive 2.x 的安装与配置",
497+
"Hive执行原理",
498+
"Hive分区和分桶",
499+
"Hive修复分区",
500+
"hive的严格模式",
499501
]
500502
},
501503
{

docs/md/bigdata/01-macOS下 Hive 2.x 的安装与配置.md renamed to docs/md/bigdata/Hive 2.x 的安装与配置.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# 01-macOS下 Hive 2.x 的安装与配置
1+
# Hive 2.x 的安装与配置
22

33
## 1 简介
44

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Hive专栏概述
2+
3+
Hive“出身名门”,是最初由Facebook公司开发的数据仓库工具。它简单且容易上手,是深入学习Hadoop技术的一个很好的切入点。专栏内容包括:Hive的安装和配置,其核心组件和架构,Hive数据操作语言,如何加载、查询和分析数据,Hive的性能调优以及安全性,等等。本书旨在为读者打牢基础,从而踏上专业的大数据处理之旅。
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
# Hive分区和分桶
2+
3+
两种用于优化查询性能的数据组织策略,数仓设计的关键概念,可提升Hive在读取大量数据时的性能。
4+
5+
## 1 分区(Partitioning)
6+
7+
根据表的某列的值来组织数据。每个分区对应一个特定值,并映射到HDFS的不同目录。为大幅减少数据量,基本必须要做!
8+
9+
常用于经常查询的列,如日期、区域等。这样可以在查询时仅扫描相关的分区,而不是整个数据集,从而减少查询所需要处理的数据量,提高查询效率。
10+
11+
物理上将数据按照指定的列(分区键)值分散存放于不同的目录中,每个分区都作为表的一个子目录。
12+
13+
### 创建分区表
14+
15+
在新能源汽车数仓项目中,如希望对整车日志表按照统计日期字段进行分区,建表语句:
16+
17+
```sql
18+
# 车辆标识`vehicle_id`、事件发生的时间戳`timestamp`、日志级别`log_level`、日志消息`message`、引擎温度`engine_temperature`、电池电量`battery_level`以及车辆位置`location`等
19+
CREATE EXTERNAL TABLE ev_vehicle_logs (
20+
vehicle_id STRING,
21+
timestamp BIGINT,
22+
log_level STRING,
23+
message STRING,
24+
engine_temperature DOUBLE,
25+
battery_level INT,
26+
location STRING
27+
)
28+
PARTITIONED BY (log_date DATE)
29+
ROW FORMAT DELIMITED
30+
FIELDS TERMINATED BY '\t'
31+
STORED AS TEXTFILE
32+
LOCATION '/path/to/hdfs/new_energy_vehicle/logs';
33+
```
34+
35+
`PARTITIONED BY (log_date DATE)`子句定义`log_date`作为表的分区键,即按照统计日期对数据进行分区存储。
36+
37+
分区键`log_date`通常是日志数据中的一个字段,该字段存储每条日志记录的日期。按日期分区日志数据可以极大地提高查询性能,特别是对于那些限定在特定日期范围内的查询。例如,如果用户只想看昨天的日志,Hive只需要扫描昨天日期分区对应的数据,而不必扫描整个数据表。
38+
39+
创建分区表之后,可以根据实际需要将数据加载到对应的分区目录中。例如,如果有一份新的日志数据,其日期为2023年10月1日,你可以这样导入数据:
40+
41+
```sql
42+
LOAD DATA INPATH '/path/to/local/file/2023-10-01.log' INTO TABLE ev_vehicle_logs PARTITION (log_date='2023-10-01');
43+
```
44+
45+
或也可用Hive的动态分区特性让Hive在数据加载时自动根据数据内容创建分区。
46+
47+
## 2 分桶(Bucketing)
48+
49+
使用哈希函数将数据行分配到固定数量的存储桶(即文件)中。这在表内部进一步组织数据。
50+
51+
- 对提高具有大量重复值的列(如用户ID)上JOIN操作的效率特别有用,因为它可以更有效地处理数据倾斜
52+
- 要求在创建表时指定分桶的列和分桶的数目
53+
54+
### 创建分桶表
55+
56+
```sql
57+
CREATE TABLE user_activities (
58+
user_id INT,
59+
activity_date DATE,
60+
page_views INT
61+
)
62+
CLUSTERED BY (user_id) INTO 256 BUCKETS;
63+
```
64+
65+
`user_id`是用于分桶的列,数据会根据用户ID的哈希值分配到256个存储桶中。
66+
67+
## 3 对比
68+
69+
- 分区是基于列的值,将数据分散到不同的HDFS目录;分桶则基于哈希值,将数据均匀地分散到固定数量的文件中。
70+
- 分区通常用于减少扫描数据的量,特别适用于有高度选择性查询的场景;而分桶有助于优化数据的读写性能,特别是JOIN操作。
71+
- 分区可以动态添加新的分区,只需要导入具有新分区键值的数据;分桶的数量则在创建表时定义且不能更改。
72+
73+
使用分区时要注意避免过多分区会导致元数据膨胀,合理选择分区键,确保分布均匀;而分桶则通常针对具有高度重复值的列。两者结合使用时,可以进一步优化表的读写性能和查询效率。
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# hive的严格模式
2+
3+
## 1 参数控制
4+
5+
一项配置,旨在阻止执行某些可能导致效率低下的查询操作。主要是通过以下几个配置参数控制的:
6+
7+
### 1.1 hive.mapred.mode
8+
9+
- 默认值:
10+
- Hive 0.x: `nonstrict`
11+
- Hive 1.x: `nonstrict`
12+
- Hive 2.x: `strict` ([HIVE-12413](https://issues.apache.org/jira/browse/HIVE-12413))
13+
- 添加于:Hive 0.3.0
14+
15+
Hive 操作执行的模式。在 `strict` 模式下,一些风险较高的查询不允许运行。如阻止:
16+
17+
- 全表扫描(参见 [HIVE-10454](https://issues.apache.org/jira/browse/HIVE-10454)
18+
- [ORDER BY](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+SortBy#LanguageManualSortBy-SyntaxofOrderBy) 需 LIMIT 子句
19+
20+
- 没有WHERE子句的查询(可能会扫描整个表)
21+
- 无分区键的查询(对分区表而言,如果不使用分区键进行查询,也可能会扫描整个表)
22+
23+
### 1.2 hive.strict.checks.large.query
24+
25+
若置true,Hive会对大查询大数据做析假以限制(如,防止笛卡尔积)
26+
27+
### 1.3 hive.strict.checks.no.partition.filter
28+
29+
若设置为true,Hive会要求分区表的查询须含有分区列的过滤条件,为防止查询无意中扫描全表。
30+
31+
### 1.4 hive.strict.checks.bucketing
32+
33+
置true时,Hive会检查对于bucketed表的查询是否使用了正确的数据集合方法。
34+
35+
## 2 开启
36+
37+
```sql
38+
SET hive.mapred.mode=STRICT;
39+
```
40+
41+
## 3 关闭
42+
43+
```sql
44+
SET hive.mapred.mode=nonstrict;
45+
```
46+
47+
严格模式下,如果你必须执行全表扫描或者不指定分区键的查询,你需要明确告知Hive你知晓这些潜在的效率问题并且接受后果。这可以通过在查询时添加相关的LIMIT子句,或者在查询中使用分区过滤条件来实现。
48+
49+
例如,在严格模式下,下面的查询会被阻止:
50+
51+
```sql
52+
SELECT * FROM sales; -- 无WHERE子句,可能扫描全表
53+
```
54+
55+
你需要这样修改查询以避免被阻止:
56+
57+
```sql
58+
SELECT * FROM sales WHERE sale_date = '2023-04-15'; -- 使用WHERE子句限制扫描
59+
```
60+
61+
者:
62+
63+
```sql
64+
SELECT * FROM sales LIMIT 100; -- 使用LIMIT子句限制返回结果的数量
65+
```
66+
67+
## 4 总结
68+
69+
开启严格模式是一种好的实践,因为它可以帮助我们避免执行一些可能导致计算资源浪费的低效查询。这在处理大型数据集和维护生产环境时尤其重要。但是,在某些情况下,如果我们知道所执行的操作是确定的,并且我们需要执行全表扫描这样的操作,可临时关闭严格模式。

0 commit comments

Comments
 (0)