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
;
好了,今天的关于分区的知识点就分享到这里。希望 你看得过瘾。