Hive应用(3.1)模式设计

1. 分区

分区产生的文件夹和文件数量应该保证在合适的范围内,常见的分区方式有两种:

  1. 根据时间分区:例如日期”20180501”进行分区,可以根据具体情况按月、按年等进行分区。
  2. 根据不同维度分区:例如根据国籍和日期进行分区。

如果找不到合适的分区方式也可以使用“分桶表

2.同一数据处理优化

1
2
3
4
INSERT OVERWRITE TABLE sales
SELECT * FROM history WHERE action = 'purchased';
INSERT OVERWRITE TABLE credits
SELECT * FROM history WHERE action = 'returned';
1
2
3
FROM history
INSERT OVERWRITE sales SELECT * WHERE action = 'purchased';
INSERT OVERWRITE credits SELECT * WHERE action = 'returned';

使用下面这种方式只需要扫描一次history表。

3.临时表分区

假设有一个ETL任务每天会抽取数据OVERWRITE到一张临时表中,某一天由于系统故障任务失败,第二天两个任务并行运行,同时写入临时表导致数据错误。

上述情况可以对临时表按日期进行分区,每次任务执行时只操作任务日期对应的分区,任务完成后删除对应分区。

4.分桶表

如果一张表不适合分区,则可以单独使用分桶,或分区配合分桶。分桶的优势在于数量较为稳定,且map-side JOIN效率更高。

创建users_clustered_by_name表,使用name分桶

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE TABLE users_clustered_by_name(
id BIGINT,
name STRING,
gender STRING,
age SMALLINT,
country STRING
)
CLUSTERED BY (name) INTO 10 BUCKETS;

SET hive.enforce.bucketing = true; --指定和分桶个数相同的reducer个数

FROM users
INSERT INTO users_clustered_by_name
SELECT *;

5.列式存储

Hive默认使用行式存储,数据以行的形式存储在文件中,但是Hive也提供列式SerDe(类似于HBase),列式存储在某些情况下更有优势:

  1. 存储重复数据:某些列中有很多重复数据
  2. 列数多:表中有很多字段