• 【博学谷学习记录】超强总结,用心分享|Hive分区表和分桶表
  • 一、Hive分区表
  • 1.1 Hive分区表介绍
  • 1.2 Hive静态分区表
  • 1.3 Hive动态分区表
  • 二、Hive分桶表
  • 2.1 Hive分桶表介绍
  • 2.2 Hive分桶表作用
  • 2.3 Hive的分桶表操作


【博学谷学习记录】超强总结,用心分享|Hive分区表和分桶表

一、Hive分区表

1.1 Hive分区表介绍

分区就是分文件夹

1、分区表实际是就是对要进行分析的文件进行分类管理;

2、本质是将相同特征的文件存放在同一个文件夹下,通过文件夹对数据进行分类;

3、分区之后在查询时,可以通过添加条件,避免进行全表扫描,提高查询效率;

4、分区表又分为静态分区和动态分区;

5、分区表是一种优化手段,是锦上添花的东西,一张表可以没有分区,但是查询效率可能会比较低。

hive多分区字段表命名规范 hive分区表的作用_hive

1.2 Hive静态分区表

#静态分区就是手动来操作分区的文件夹

#----------------------单级分区-一级文件夹------------------------------

-- 1、数据样例
/*
2021-01-28,Autauga,Alabama,01001,5554,69
2021-01-28,Baldwin,Alabama,01003,17779,225
2021-01-28,Barbour,Alabama,01005,1920,40
2021-01-28,Bibb,Alabama,01007,2271,51
2021-01-28,Blount,Alabama,01009,5612,98
2021-01-29,Bullock,Alabama,01011,1079,29
2021-01-29,Butler,Alabama,01013,1788,60
2021-01-29,Calhoun,Alabama,01015,11833,231
2021-01-29,Chambers,Alabama,01017,3159,76
2021-01-29,Cherokee,Alabama,01019,1682,35
2021-01-30,Chilton,Alabama,01021,3523,79
2021-01-30,Choctaw,Alabama,01023,525,24
2021-01-30,Clarke,Alabama,01025,3150,38
2021-01-30,Clay,Alabama,01027,1319,50
 */

-- 2、创建分区表
drop table t_covid;
create external table t_covid(
    dt_value string  ,
    country string ,
    state  string ,
    country_code string ,
    cases int ,
    deaths int
)
partitioned by (dt string) -- 这里用来指定分区的字段,字段名字可以随便写
row format delimited fields terminated by ',' -- 自定字段之间的分隔符
;

-- 3、给分区表加载数据
load data local inpath '/root/hive_data/covid-28.dat'  into table t_covid partition (dt='2021-01-28');
load data local inpath '/root/hive_data/covid-29.dat'  into table t_covid partition (dt='2021-01-29');
load data local inpath '/root/hive_data/covid-30.dat'  into table t_covid partition (dt='2021-01-30');


-- 4、查看分区表数据
select * from t_covid;  --查看所有分区数据
select * from t_covid where dt='2021-01-28'; -- 查询指定单个分区的数据
select * from t_covid where dt='2021-01-28' or dt='2021-01-29' ; -- 查询指定多个分区的数据
#----------------------单级分区-多级文件夹------------------------------
-- 1、数据样例
/*
2021-02-28,Cleburne,Alabama,01029,1258,28
2021-02-28,Coffee,Alabama,01031,4795,72
2021-02-28,Colbert,Alabama,01033,5686,104
2021-02-28,Conecuh,Alabama,01035,999,23
2021-02-28,Coosa,Alabama,01037,670,19
2021-02-28,Covington,Alabama,01039,3504,87
2021-02-28,Crenshaw,Alabama,01041,1279,47
2021-02-28,Cullman,Alabama,01043,8466,145、
2021-02-29,Dale,Alabama,01045,4235,92
2021-02-29,Dallas,Alabama,01047,3181,108
2021-02-29,DeKalb,Alabama,01049,8052,130
2021-02-29,Elmore,Alabama,01051,8449,131
2021-02-30,Escambia,Alabama,01053,3478,47
2021-02-30,Etowah,Alabama,01055,12359,228
2021-02-30,Fayette,Alabama,01057,1841,37
2021-02-30,Franklin,Alabama,01059,3829,55
2021-02-30,Geneva,Alabama,01061,2205,51
*/
-- 2、创建分区表
drop table t_covid2;
create  table t_covid2(
    dt_value string  ,
    country string ,
    state  string ,
    country_code string ,
    cases int ,
    deaths int
)
partitioned by (month string,dt string) -- 这里用来指定分区的字段,字段名字可以随便写
row format delimited fields terminated by ',' -- 自定字段之间的分隔符
;
-- 3、给分区表加载数据
-- 1月份数据

load data local inpath '/root/hive_data/covid-28.dat'  into table t_covid2
    partition (month='2021-01',dt='2021-01-28');

load data local inpath '/root/hive_data/covid-29.dat'  into table t_covid2
      partition (month='2021-01',dt='2021-01-29');

load data local inpath '/root/hive_data/covid-30.dat'  into table t_covid2
      partition (month='2021-01',dt='2021-01-30');
-- 2月份数据
load data local inpath '/root/hive_data/2_month/covid-28.dat'  into table t_covid2
    partition (month='2021-02', dt='2021-02-28');


load data local inpath '/root/hive_data/2_month/covid-29.dat'  into table t_covid2
      partition (month='2021-02', dt='2021-02-29');

load data local inpath '/root/hive_data/2_month/covid-30.dat'  into table t_covid2
    partition (month='2021-02', dt='2021-02-30');
-- 4、查询数据
select * from t_covid2; -- 查询所有分区

select * from t_covid2 where month = '2021-02'; --  查询2月份数据

select * from t_covid2 where month = '2021-02' and  dt = '2021-02-28'; --  查询2月28号份数据
-- 手动添加分区
alter table t_covid2 add partition(month='2021-03',dt='2021-03-28');
 -- 查看分区文件夹信息
show partitions t_covid2;

1.3 Hive动态分区表

#动态分区就是Hive可以根据数据本身的特点来自动创建分区文件夹
-- 0、样例数据
/*
1	2022-01-01	zhangsan	80
2	2022-01-01	lisi	70
3	2022-01-01	wangwu	90
1	2022-01-02	zhangsan	90
2	2022-01-02	lisi	65
3	2022-01-02	wangwu	96
1	2022-01-03	zhangsan	91
2	2022-01-03	lisi	66
3	2022-01-03	wangwu	96
 */
-- 1、设置参数
set hive.exec.dynamic.partition=true; -- 开启动态分区的功能
set hive.exec.dynamic.partition.mode=nonstrict; -- 设置非严格模式
-- 2、创建普通非分区表
use myhive;
create table myhive.test1
(
    id       int,
    date_val string,
    name     string,
    score    int
)
row format delimited fields terminated by '\t';
;
-- 3、给普通非分区表加载数据
load data local inpath '/root/hive_data/dynamic_partition/a.txt' into table test1;
select *  from test1;
-- 4、创建最终的分区表
drop  table test2;
create table myhive.test2
(
    id       int,
    name     string,
    score    int
)
partitioned by (dt string)
row format delimited fields terminated by '\t';
;
-- 5、将普通表的数据查询插入到最终分区表
insert overwrite  table  test2
select id,name,score,date_val from test1; -- 分区字段一定要放在select的最后
-- 6、数据查询
select * from test2;
select * from test2 where dt='2022-01-01';
select * from test2 where dt='2022-01-02';
select * from test2 where dt='2022-01-03';

二、Hive分桶表

2.1 Hive分桶表介绍

1、分桶表和分区表没什么关系
2、分桶表是将表数据分到多个文件,分区表是将数据分到多个文件夹
3、分桶表底层就是MapReduce中分区
4、分桶和分区的区别
   1)MapReduce的分区就是Hive的分桶
   2)Hive的分桶就是MapReduce的分区
   3)Hive的分区和MapReduce分区没什么关系
5、结论:分桶就是分文件
6、分桶的本质就是将大表进行拆分编程小表,小表好join
7、一张表既可以是分区表也可以是分桶表

2.2 Hive分桶表作用

1、提高Join的效率
2、用于数据的抽样

hive多分区字段表命名规范 hive分区表的作用_Hive_02


hive多分区字段表命名规范 hive分区表的作用_大数据_03

2.3 Hive的分桶表操作

-- 0、样例数据
 新冠数据:covid19.dat
-- 1、开启分桶功能
set hive.enforce.bucketing=true;

-- 2、创建普通表
drop table t_covid_common;
create table t_covid_common
(
    dt_value string  ,
    country string ,
    state  string ,
    country_code string ,
    cases int ,
    deaths int
) row format delimited fields terminated by ',';

-- 3、给普通表加载数据
load data local inpath '/root/hive_data/covid19.dat' overwrite into table t_covid_common;
select  * from t_covid_common;

-- 4、创建分桶表
drop table t_covid_bucket;
create table t_covid_bucket
(
    dt_value string  ,
    country string ,
    state  string ,
    country_code string ,
    cases int ,
    deaths int
)
clustered by(country_code) into 5 buckets  -- country_code就是MapReduce分区中K2
row format delimited fields terminated by ',';


-- 5、查询普通表给分桶表加载数据
 insert overwrite table t_covid_bucket
select * from t_covid_common cluster by(country_code); 

-- 可以在SQL的前边加上explain,查看SQL的执行计划