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 ;
复制
好了,今天的关于分区的知识点就分享到这里。希望 你看得过瘾。
欢迎一键三连,你的每一个点赞对于未来来说,都是有意义的!