1. 准备源表
Create external table 源表(
字段 类型,
字段 类型,
Time date comment '分区字段'
)row format delimited
Fields terminated by ','
Location '上传的表存放的路径';
加载数据:
Linux 中写:hadoop fs -put ‘linux文件路径’ ’文件要上传的路径,一般为要映射的表所在的路径’
DataGrip中写:
Load data local inpath ‘Linux的文件路径’ into table 表名;
Load data inpath ‘HDFS中的文件路径’ into table 表名;(有剪切效果)
2. 分区表
2.1 创建一级分区表
查询表时字段包含:创建字段+分区字段
Create table 表名_分区 (
字段1,
字段2
) partition by (time date)
row format delimited
Fields terminated by ',';
给分区表静态加载数据:
Insert into table 表名_分区 partition (time='2024-01-01') Select 字段1,字段2 from 源表 where time='2024-01-01';
Insert into table 表名_分区 partition (time='2024-01-02') Select 字段1,字段2 from 源表 where time='2024-01-02';
给分区表动态加载数据:
开启动态分区:
Set hive.exec.dynamic.partition.mode=nonstrict;
情况1:
Insert into table 表名_分区 partition (time) Select 字段1,字段2,time from 源表;
情况2:
Insert into table 表名_分区 partition (year) Select 字段1,字段2,year(time) as year from 源表;
2.2 创建多级分区表
表中字段包含:创建字段+分区字段
Create table 表名_分区 (
字段1,
字段2
) partition by (year string ,month string,day string)
row format delimited
Fields terminated by ',';
给分区表动态加载数据:
开启动态分区:
Set hive.exec.dynamic.partition.mode=nonstrict;
Insert into table 表名_分区 partition (year,month,day) Select 字段1,字段2,year(time) string , month(time) string , day(time) string from 源表;
3. 修改分区
3.1 增加分区
增加分区:本质上是更改元数据,不会加载数据,因此需保证在修改分区的路径下数据文件已经存在,或者增加完分区后再加载数据。
一级分区表添加:
Alter table 表名_分区 add
partition (time='2024-01-01') location '/user/hive/warehouse/表名_分区/time=2024-01-01'
partition (time='2024-01-02') location '/user/hive/warehouse/表名_分区/time=2024-01-02';
多级分区表添加:
Alter table 表名_分区 add
partition (year='2024',month='02') location '/user/hive/warehouse/表名_分区/与其他分区名类似'
partition (year='2024',month='03') location '/user/hive/warehouse/表名_分区/与其他分区名类似';
3.2 重命名分区
Alter table 表名_分区 partition 原分区名 rename to partition 新分区名;
Alter table 表名_分区 partition(time='2024-01-01') rename to partition (time='2024-01-05');
3.3 删除分区
Alter table 表名_分区 drop if exists partition (time=’2024-01-04’) [purge]不放进垃圾桶;
3.4 修改分区
Alter table 表名_分区 partition (time=’2024-01-01’) set (修改文件存储格式,分区位置);
3.5 MSCK元数据修复
指定修复分区的哪些操作,默认修复增加分区操作
MSCK repair table 表名 [add/drop partitions]
使用场景:
在建立完分区表且加载完数据后,想要从HDFS或Linux中直接添加/删除一个分区时,此时增加/删除的分区并没有存放在分区表的元数据中,因此后期再加载数据文件到该分区目录时不生效,因此想要MSCK修复表的元数据。
3.5.1 修复增加分区
#在linux中使用hdfs命令创建分区文件夹
hadoop fs -mkdir -p /user/hive/..../表名_分区/time='2024-08-08';
hadoop fs -mkdir -p /user/hive/..../表名_分区/time='2024-08-09';
#把数据文件上传到对应的分区文件夹下
hadoop fs -put 文件名0808.txt /user/hive/..../表名_分区/time='2024-08-08';
hadoop fs -put 文件名0809.txt /user/hive/..../表名_分区/time='2024-08-09';
查询表时,发现表中并没有0808和0809的数据,使用MSCK来修复
MSCK repair table 表名_分区 add partitions;
3.5.2 修复删除分区
#在linux中使用hdfs命令删除分区文件夹
hadoop fs -rm -r /user/hive/..../表名_分区/time='2024-08-08';
hadoop fs -rm -r /user/hive/..../表名_分区/time='2024-08-09';
在show 表的元数据时,发现表的该分区元数据信息并没有删除,使用MSCK修复
MSCK repair table 表名_分区 drop partitions;
4. 分区加载数据
均是在DataGrip中执行的
4.1 数据文件加载到分区表中
load data [local] inpath 'HDFS[Linux]文件地址' [overwrite] into table 表名 partition(分区字段='分区值');
文件地址分为相对、绝对、完整的URI
相对:linux/HDFS手动进入到目录下 ./剩余的路径
绝对:/完整的路径
完整:HDFS为 hdfs://namenode:进程号/文件路径 ;Linux为 file:///文件路径
overwrite :后面跟的是目标表的指定分区目录,则只覆盖了指定分区目录中的数据。
4.2 源表数据插入到分区表中
#静态分区
from 源表
insert overwrite table 表名 partition (分区字段='值')
select 字段 (该字段中不包含分区字段,因为分区字段的值已经指定) ....
#动态分区
from 源表
insert overwrite table 表名 partition (分区字段)
select 字段 , 分区字段 ....
对比 insert+select 方式源表插入到普通表中:
#追加插入
insert into table 表名 select 字段 from 源表;
#覆盖插入
insert overwrite table 表名 select 字段 from 源表;
#一次扫描多次插入
from 源表
insert into table 表1 select 字段
insert overwrite table 表2 select 字段;
5. 导出数据
#将文件导出到HDFS中
insert overwrite directory '导出文件放置的HDFS目录' row format delimited fields terminated by ',' select 字段 from 表名;
#将文件导出到Linux中
insert overwrite local directory '导出文件放置的Linux目录' row format delimited fields terminated by ',' select 字段 from 表名;
#表文件多重导出到表中
from 源表
insert overwrite [local] directory '路径1' select 字段 ....
insert overwrite [local] directory '路径2' select 字段 ....