Hive 分区

打印 上一主题 下一主题

主题 550|帖子 550|积分 1650

1. 预备源表

  1. Create external table 源表(
  2. 字段 类型,
  3. 字段 类型,
  4. Time  date  comment  '分区字段'
  5. )row format delimited
  6. Fields terminated by ','
  7. Location '上传的表存放的路径';
复制代码
加载数据:
Linux 中写:hadoop fs -put ‘linux文件路径’  ’文件要上传的路径,一般为要映射的表所在的路径’

DataGrip中写:

Load data local inpath ‘Linux的文件路径’ into table 表名;

Load data inpath ‘HDFS中的文件路径’ into table 表名;(有剪切效果)
2. 分区表

2.1 创建一级分区表

查询表时字段包含:创建字段+分区字段
  1. Create table 表名_分区 (
  2. 字段1,
  3. 字段2
  4. ) partition by (time date)
  5. row format delimited
  6. Fields terminated by ',';
复制代码
给分区表静态加载数据:

  1. Insert into table 表名_分区 partition (time='2024-01-01') Select 字段1,字段2 from 源表 where time='2024-01-01';
  2. 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:

  1. Insert into table 表名_分区 partition (time) Select 字段1,字段2,time  from 源表;
复制代码
情况2:

  1. Insert into table 表名_分区 partition (year) Select 字段1,字段2,year(time) as year  from 源表;
复制代码
2.2 创建多级分区表

表中字段包含:创建字段+分区字段

  1. Create table 表名_分区 (
  2. 字段1,
  3. 字段2
  4. ) partition by (year string ,month string,day string)
  5. row format delimited
  6. Fields terminated by ',';
复制代码
给分区表动态加载数据:

开启动态分区:

Set hive.exec.dynamic.partition.mode=nonstrict;

  1. Insert into table 表名_分区 partition (year,month,day) Select 字段1,字段2,year(time) string , month(time) string , day(time) string  from 源表;
复制代码
3. 修改分区

3.1 增加分区

增加分区:本质上是更改元数据,不会加载数据,因此需包管在修改分区的路径下数据文件已经存在,或者增加完分区后再加载数据。

一级分区表添加:

  1. Alter table 表名_分区 add
  2. partition (time='2024-01-01') location '/user/hive/warehouse/表名_分区/time=2024-01-01'
  3. partition (time='2024-01-02') location '/user/hive/warehouse/表名_分区/time=2024-01-02';
复制代码
多级分区表添加:

  1. Alter table 表名_分区 add  
  2. partition (year='2024',month='02') location '/user/hive/warehouse/表名_分区/与其他分区名类似'
  3. partition (year='2024',month='03') location '/user/hive/warehouse/表名_分区/与其他分区名类似';
复制代码
3.2 重定名分区

Alter table 表名_分区 partition 原分区名 rename to partition 新分区名;

  1. 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 修复增加分区

  1. #在linux中使用hdfs命令创建分区文件夹
  2. hadoop fs -mkdir -p /user/hive/..../表名_分区/time='2024-08-08';
  3. hadoop fs -mkdir -p /user/hive/..../表名_分区/time='2024-08-09';
  4. #把数据文件上传到对应的分区文件夹下
  5. hadoop fs -put 文件名0808.txt /user/hive/..../表名_分区/time='2024-08-08';
  6. hadoop fs -put 文件名0809.txt /user/hive/..../表名_分区/time='2024-08-09';
复制代码
查询表时,发现表中并没有0808和0809的数据,使用MSCK来修复
  1. MSCK repair table 表名_分区 add partitions;
复制代码
3.5.2 修复删除分区

  1. #在linux中使用hdfs命令删除分区文件夹
  2. hadoop fs -rm -r /user/hive/..../表名_分区/time='2024-08-08';
  3. hadoop fs -rm -r /user/hive/..../表名_分区/time='2024-08-09';
复制代码
在show 表的元数据时,发现表的该分区元数据信息并没有删除,使用MSCK修复
  1. MSCK repair table 表名_分区 drop partitions;
复制代码
4. 分区加载数据 

均是在DataGrip中执行的
4.1 数据文件加载到分区表中

  1. load data [local] inpath 'HDFS[Linux]文件地址' [overwrite] into table 表名 partition(分区字段='分区值');
复制代码
文件地址分为相对、绝对、完整的URI
相对:linux/HDFS手动进入到目录下 ./剩余的路径
绝对:/完整的路径
完整:HDFS为 hdfs://namenode:历程号/文件路径 ;Linux为  file:///文件路径
overwrite :后面跟的是目标表的指定分区目录,则只覆盖了指定分区目录中的数据。
4.2 源表数据插入到分区表中

  1. #静态分区
  2. from 源表
  3. insert overwrite table 表名 partition (分区字段='值')
  4. select 字段 (该字段中不包含分区字段,因为分区字段的值已经指定) ....
  5. #动态分区
  6. from 源表
  7. insert overwrite table 表名 partition (分区字段)
  8. select 字段 , 分区字段  ....
复制代码
对比 insert+select 方式源表插入到普通表中:
  1. #追加插入
  2. insert into table 表名 select 字段 from 源表;
  3. #覆盖插入
  4. insert overwrite table 表名 select 字段 from 源表;
  5. #一次扫描多次插入
  6. from 源表
  7. insert into table 表1 select 字段
  8. insert overwrite table 表2 select 字段;
复制代码
5. 导出数据

  1. #将文件导出到HDFS中
  2. insert overwrite directory '导出文件放置的HDFS目录'  row format delimited fields terminated by ','  select 字段 from 表名;
  3. #将文件导出到Linux中
  4. insert overwrite local directory '导出文件放置的Linux目录'  row format delimited fields terminated by ','  select 字段 from 表名;
  5. #表文件多重导出到表中
  6. from 源表
  7. insert overwrite [local] directory '路径1' select 字段 ....
  8. insert overwrite [local] directory '路径2' select 字段 ....
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

飞不高

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表