Hive 动态分区使用教程

175 阅读2分钟

1 目标

使用 Hive 中的动态分区的功能,对未分区的原始数据进行分区(使用原始数据中的字段值)插入到正式数据表中。

tmp_table.tmp_test_table -> tmp_table.tmp_parquet_table

跳转:导数 Sql

2 创建测试表

  • 原始数据表

创建原始表,未分区,一个 txt 文件映射的数据表

tmp_table.tmp_test_table

CREATE TABLE tmp_table.tmp_test_table (                         
  category1_id STRING,                                                    
  category2_id STRING,                                                    
  category3_id STRING,     
  month STRING
)                                                                         
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','                             
STORED AS TEXTFILE;                                                        
  • 最终分区表

创建分区数据表,使用 parquet 存储,使用 time 作为分区字段

tmp_table.tmp_parquet_table

CREATE TABLE tmp_table.tmp_parquet_table (        
  category1_id STRING,                                     
  category2_id STRING,                                     
  category3_id STRING                                      
)                                                          
PARTITIONED BY (                                           
  time STRING                                              
)                                                          
STORED AS PARQUET;
  • 导入测试数据

将数据文件导入到原始数据表中,这里可以使用 load data inpath xxx into table xxx 命令将 hdfs 上的文件导入到表中,也可以直接将主机上的文件传到 hdfs 原始表对应的路径下。此处使用 insert 命令随意插入几条测试数据。

insert into tmp_table.tmp_test_table values 
('1001', '1002', '1003', '2022-09-14'),
('2001', '2002', '2003', '2022-09-14'),
('3001', '3002', '3003', '2022-09-15'),
('4001', '4002', '4003', '2022-09-16'),
('5001', '5002', '5003', '2022-09-17');
-- select * from tmp_table.tmp_test_table;
+--------------+--------------+--------------+------------+
| category1_id | category2_id | category3_id | month      |
+--------------+--------------+--------------+------------+
| 1001         | 1002         | 1003         | 2022-09-14 |
| 2001         | 2002         | 2003         | 2022-09-14 |
| 3001         | 3002         | 3003         | 2022-09-15 |
| 4001         | 4002         | 4003         | 2022-09-16 |
| 5001         | 5002         | 5003         | 2022-09-17 |
+--------------+--------------+--------------+------------+

3 动态分区导数

  • month 字段分区导入到分区表

注意事项

分区将会由最后的字段动态的生成(字段名可以与分区名不一致)

# 开启动态分区
set hive.exec.dynamic.partition=true;
# 设置动态分区模式
set hive.exec.dynamic.partition.mode=nonstrict;
# 插入数据
INSERT INTO tmp_table.tmp_parquet_table partition(time)
SELECT category1_id,
       category2_id,
       category3_id,
       month
FROM tmp_table.tmp_test_table;
  • 查看目标表分区
show partitions tmp_table.tmp_parquet_table;
+------------------+
|    partition     |
+------------------+
| time=2022-09-14  |
| time=2022-09-15  |
| time=2022-09-16  |
| time=2022-09-17  |
+------------------+

4 配置说明

参考:Hive 官方文档 ,搜索 hive.exec.dynamic.partition

# 开启动态分区
set hive.exec.dynamic.partition=true;

# 设置动态分区模式
# - 在严格模式下,用户必须至少指定一个静态分区,以防用户意外覆盖所有分区
# - 在非严格模式下允许所有分区都是动态的
set hive.exec.dynamic.partition.mode=nonstrict;

# 允许在每个节点中创建的最大动态分区数
set hive.exec.max.dynamic.partitions.pernode=100;

# 总共允许创建的动态分区的最大数量
set hive.exec.max.dynamic.partitions=1000;