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;