1. 什么是分区
1. Hive 中的分区就是 分目录(对数据文件) (表 = 目录,分区 = 目录)
2. 为什么创建分区(分区的好处)
1. 数据隔离&查询优化
3. 单分区

-- 单分区
-- 创建分区表(单个分区)
create table home.ods_front_log_dd (
log_id string comment '日志id',
log_type string comment '日志类型',
event_key string comment '用户行为表示')
comment '前端日志表(天级)'
PARTITIONED BY (ds string)
row format delimited fields terminated by '\t'
lines terminated by '\n'
stored as orc;
-- 往分区表中 写入数据(静态分区)
insert overwrite table home.ods_front_log_dd partition(ds = '2022-01-01')
select 1 as log_id,'展示' as log_type,'首页展示' as event_key union all
select 2 as log_id,'点击' as log_type,'首页点击' as event_key union all
select 3 as log_id,'展示' as log_type,'落地页展示' as event_key union all
select 4 as log_id,'点击' as log_type,'首页结果页' as event_key union all
select 5 as log_id,'点击' as log_type,'首页点击1' as event_key union all
select 6 as log_id,'点击' as log_type,'首页点击2' as event_key;
-- 查看数据目录
/user/hive/warehouse/home.db/ods_front_log_dd/ds=2022-01-01/000000_0
View Code
4. 多分区

-- 多分区
-- 创建分区表(多个分区)
create table home.ods_front_log_hour (
log_id string comment '日志id',
log_type string comment '日志类型',
event_key string comment '用户行为表示')
comment '前端日志表(小时)'
PARTITIONED BY (ds string,hour string)
row format delimited fields terminated by '\t'
lines terminated by '\n'
stored as orc;
-- 往分区表中 写入数据(多个分区)
insert overwrite table home.ods_front_log_hour partition(ds = '2022-01-01' ,hour = '00')
select 1 as log_id,'展示' as log_type,'首页展示' as event_key union all
select 2 as log_id,'点击' as log_type,'首页点击' as event_key union all
select 3 as log_id,'展示' as log_type,'落地页展示' as event_key union all
select 4 as log_id,'点击' as log_type,'首页结果页' as event_key union all
select 5 as log_id,'点击' as log_type,'首页点击1' as event_key union all
select 6 as log_id,'点击' as log_type,'首页点击2' as event_key;
-- 数据目录
/user/hive/warehouse/home.db/ods_front_log_hour/ds=2022-01-01/hour=00/000000_0
View Code
5. 动态分区
-- 1. 什么是动态分区 &静态分区
1. 静态分区 : 向分区表中写入数据时, 分区字段的值 必须写死(为固定值)
2. 动态分区(Dynamic Partition) : 向分区表中写入数据时, 分区字段的值 根据数据中分区字段的值 进行自动判断
-- 2. 参数设置
-- 1. 开启动态分区功能(默认 true,开启)
set hive.exec.dynamic.partition=true;
-- 2. 设置非严格模式(默认为 strict,严格模式)
-- strict : 严格模式(必须指定至少一个分区字段为 静态分区)
-- nonstrict : 非严格模式(所有分区字段都可以使用 动态分区)
set hive.exec.dynamic.partition.mode=nonstrict;
-- 3. 设置最大分区数(默认为 1000)
-- 表示每个maper或reducer可以允许创建的最大动态分区个数,默认是100,超出则会报错
set hive.exec.max.dynamic.partitions=2000;
-- 4.设置 动态分区语句允许创建的 最大分区数(默认为 100)
-- 表示一个动态分区语句可以创建的最大动态分区个数,超出报错
-- 由要向表中插入的数据决定
set hive.exec.max.dynamic.partitions.pernode=400;
-- 5. 整个 MR Job 中,最大可以创建多少个 HDFS 文件(默认为 100000)
set hive.exec.max.created.files=100000;
-- 6. 当有空分区 产生时,是否抛异常 (默认为 false)
-- 一般不需要设置
set hive.error.on.empty.partition=false;


-- 往分区表中 写入数据(动态分区)
-- 查询的最后一个字段 为分区字段
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.max.dynamic.partitions=2000;
set hive.exec.max.dynamic.partitions.pernode=400;
set hive.exec.max.created.files=100000;
insert overwrite table home.ods_front_log_dd partition(ds)
select 1 as log_id,'展示' as log_type,'首页展示' as event_key,'2022-01-02' as ds union all
select 2 as log_id,'点击' as log_type,'首页点击' as event_key,'2022-01-02' as ds union all
select 3 as log_id,'展示' as log_type,'落地页展示' as event_key,'2022-01-02' as ds union all
select 4 as log_id,'点击' as log_type,'首页结果页' as event_key,'2022-01-03' as ds union all
select 5 as log_id,'点击' as log_type,'首页点击1' as event_key,'2022-01-03' as ds union all
select 6 as log_id,'点击' as log_type,'首页点击2' as event_key,'2022-01-03' as ds;
-- 数据目录
drwxr-xr-x root supergroup 0 B Jan 29 15:03 0 0 B ds=2022-01-01
drwxr-xr-x root supergroup 0 B Jan 29 16:02 0 0 B ds=2022-01-02
drwxr-xr-x root supergroup 0 B Jan 29 16:02 0 0 B ds=2022-01-03
View Code
6. 查看分区、增加分区、删除分区
--1. 查看分区表 有多少个分区
show partitions home.ods_front_log_dd;
partition
ds=2022-01-01
ds=2022-01-02
ds=2022-01-03
--2. 增加分区(创建空目录)
alter table home.ods_front_log_dd add partition(ds='001'); -- 创建单个分区
alter table home.ods_front_log_dd add partition(ds='002') partition(ds='003'); -- 创建多个分区
--3. 删除分区
alter table home.ods_front_log_dd drop partition(ds='001'); -- 创建单个分区
alter table home.ods_front_log_dd drop partition(ds='002') ,partition(ds='003'); -- 创建多个分区
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界