emmmm,今天来谈谈hive分区表吧,一个基础而又重点的技能。



1,分区表基础知识

1.1,建表语句

--比如说想创建分区表  db_adm.new_cust_number_situ

drop table if exists db_adm.new_cust_number_situ ;

create table  db_adm.new_cust_number_situ (
busi_date    string  comment '业务日期',
cust_no      string  comment '客户号',
cust_name    string  comment '客户名称',
bsof_no      string  comment '分支机构编号',
area_no      string  comment '片区编号',
etl_time     string  comment 'ETL时间'
)
comment'新增客户情况表'
partiton by (dt string  comment '日期分区')
stored  as  orc
;

1.2,查询建表是否成功

--查看表结构

desc   db_adm.new_cust_number_situ  ;

--查看建表语句

show create table db_adm.new_cust_number_situ ;

1.3,分区表在HDFS上是怎么展示的

注意,一般的非分区表直接是以文件的形式展示;

但是分区表,在HDFS上,分区是以文件夹的形式展示,

其分区下的数据是以该文件夹下的文件来展示。

2,静态分区

如果你想把旧系统的表 db_adm.new_cust_number_007(两个表,表结构一致,也是分区表) 所有数据都插入新系统的表db_adm.new_cust_number_situ 中, 放在同一个指定的分区(20240517)中,则需要使用静态分区。

2.1,首先,可以通过命令添加分区(可先删再创建)

--删除分区

alter table db_adm.new_cust_number_situ drop partition (dt='20240517');

--创建分区

alter table db_adm.new_cust_number_situ  add partition (dt='20240517');

--分区重新命名(当然也可以前面两个步骤实现)

alter table db_adm.new_cust_number_situ drop partition (dt='20240517')
rename to partition (dt='20240518')

--创建/修改分区后检查是否成功

show partitions  db_adm.new_cust_number_situ  ;

2.2,把旧表所有数据数据插入分区

--加载数据到指定分区表  db_adm.new_cust_number_situ


insert overwriter table  db_adm.new_cust_number_situ partition ( dt = '20240517' )
select  busi_date   
       ,cust_no      
       ,cust_name   
       ,bsof_no     
       ,area_no     
       ,etl_time    
from db_adm.new_cust_number_007
;

这样子就把表  db_adm.new_cust_number_007 中所有分区所有数据都放在表db_adm.new_cust_number_situ  的dt= '20240517'下了。

3,动态分区

但是如果要把db_adm.new_cust_number_007 中所有分区所有数据都放在表db_adm.new_cust_number_situ 对应的分区下。

这个时候怎么办,难道我们要依次去创建几十几百个分区,写无数个静态分区的代码,把对应的数据插入到在指定的分区里嘛??

这个时候就需要咱们用动态分区了。

3.1,,设置动态分区模式,非严格模式

--动态分区添加数据
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

3.2,动态分区的加载

--动态分区

insert overwriter table  db_adm.new_cust_number_situ partition ( dt  )
select  busi_date   
       ,cust_no      
       ,cust_name   
       ,bsof_no     
       ,area_no     
       ,etl_time    
       ,dt         --会根据这个字段判断出数据属于哪个分区,实现自动分配
from db_adm.new_cust_number_007
;

注意,最后一个字段,是用来判断数据是属于哪个分区的(会根据这个创建分区,然后把对应的数据加载到这个分区里),字段名字是什么无所谓,数据类型和分区字段一致就行。

4, 多级分区表

4.1,多分区表的创建

--比如说想创建分区表  db_adm.new_cust_number_situ

drop table if exists db_adm.new_cust_number_situ ;

create table  db_adm.new_cust_number (
busi_date    string  comment '业务日期',
cust_no      string  comment '客户号',
cust_name    string  comment '客户名称',
bsof_no      string  comment '分支机构编号',
area_no      string  comment '片区编号',
etl_time     string  comment 'ETL时间'
)
comment'新增客户情况表'
partiton by (dt      string  comment '日期分区'
           , prod_no string  comment '产品号')    --在此处新增
stored  as  orc
;

像上面两个分区字段,dt 就是一级分区,prod_no 就属于二级分区。

多分区表,在HDFS上,分区是以文件夹的形式展示,一级分区就是一级文件夹,二级分区就是二级文件夹,其分区下的数据是以二级文件夹下的文件来展示。

知道了这个,你就知道怎么操作分区了。

4.2,多级分区的操作命令

--删除分区(删除一级分区,其下面的二级分区也会全部删除)

alter table db_adm.new_cust_number_situ drop partition (dt='20240517');

--创建分区

alter table db_adm.new_cust_number_situ  add partition (dt='20240517',prod_no = '007');

alter table db_adm.new_cust_number_situ  add partition (dt='20240517',prod_no = '008');

--当然你也可以先只建立一级分区

alter table db_adm.new_cust_number_situ  add partition (dt='20240517');

--分区重新命名(把产品号007换为008)

alter table db_adm.new_cust_number_situ drop partition  (dt='20240517',prod_no = '007')
rename to partition  (dt='20240517',prod_no = '008')

--创建/修改分区后检查是否成功

show partitions  db_adm.new_cust_number_situ  ;

4.2,数据的插入(动态分区)

如果还是要一对一的按照分区就行数据插入:

--动态分区模式设定

set hive.exec.dynamic.partition=true;

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

--动态分区数据插入

insert overwriter table  db_adm.new_cust_number_situ partition ( dt  )
select  busi_date   
       ,cust_no      
       ,cust_name   
       ,bsof_no     
       ,area_no     
       ,etl_time    
       ,dt         --会根据这个字段判断出数据属于哪个一级分区,实现自动分配
       ,prod_no    --会根据这个字段判断出数据属于哪个二级分区,实现自动分配
from db_adm.new_cust_number_007
;

当然,上面的dt, prod_no这两个分区字段也可以取其一酌情写死。把数据放在固定的分区。两个字段都写死,那就是放在一个固定的分区了(此处相当于静态分区的效果)。

4.2,数据的插入(静态分区)

-静态分区数据插入

insert overwriter table  db_adm.new_cust_number_situ partition ( dt ='20240517',prod_no = '007' )
select  busi_date   
       ,cust_no      
       ,cust_name   
       ,bsof_no     
       ,area_no     
       ,etl_time    
from db_adm.new_cust_number_007
;

好了,今天的关于分区的知识点就分享到这里。希望 你看得过瘾。