6

hive从入门到放弃(四)——分区与分桶 - 大数据的奇妙冒险

 2 years ago
source link: https://www.cnblogs.com/lyuzt/p/16091617.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

今天讲讲分区表和分桶表,前面的文章还没看的可以点击链接:
hive从入门到放弃(一)——初识hive
hive从入门到放弃(二)——DDL数据定义
hive从入门到放弃(三)——DML数据操作

分区可以提高查询效率,实际上 hive 的一个分区就是 HDFS 上的一个目录,目录里放着属于该分区的数据文件。

分区的基本操作

创建分区表

create table partition_table(
	col1 int, 
	col2 string
)
partitioned by (part_col string)
row format delimited fields terminated by '\t';

*分区字段不能是表中字段

创建完分区表如果需要将数据导入表中,需要用 load 命令导入;

 load data local inpath 
'/data_dir/data_file' into table partition_table 
partition(part_col='20220331');

如果是在 HDFS 中创建目录并将数据文件传到目录中,是没办法查到的,因为查询分区表是需要查询元数据的;

如果非要用这种方法或者已经做了,可以执行修复命令: msck repair table table_name;

show partitions partition_table;
select * from partition_table where part_col='20220331';
alter table partition_table add partition(part_col='20220331');
alter table partition_table drop partition(part_col='20220331');

二级分区相当于在一级分区对应的目录上新增一个目录,一般用于单个分区数据量很大,需要做拆解的情况。

创建二级分区表

create table partition_table(
	col1 int, 
	col2 string
)
partitioned by (part_col1 string, part_col2 string)
row format delimited fields terminated by '\t';

二级分区表的其它操作与一级的区别不大,因此不做过多的描写。

关系型数据库中,对分区表 Insert 数据时候,数据库自动会根据分区字段的值,将数据插入到相应的分区中

Hive 中也提供了类似的机制,即动态分区(Dynamic Partition),不过使用 Hive 的动态分区需要进行相应的配置。

开启动态分区功能(默认 true,开启)

hive.exec.dynamic.partition=true

设置为非严格模式

hive.exec.dynamic.partition.mode=nonstrict

默认 strict,表示至少指定一个分区为静态分区,nonstrict 表示允许所有的分区字段都能使用动态分区。

所有执行 MR 的节点上,最大一共可以创建多少个动态分区。默认 1000

hive.exec.max.dynamic.partitions=1000

每个执行 MR 的节点上,最大可以创建多少个动态分区。比如源数据中包含了一年的数据,即 day 字段有 365 个值,那么该参数就
需要设置成大于 365,如果使用默认值 100,则会报错。

hive.exec.max.dynamic.partitions.pernode=100

动态插入数据到分区

insert into partition_table partition(part_col) select * from table_name;

分区提高了数据的查询效率,同时还能将数据隔离开,但是并非所有数据能形成合理的分区。

hive可以将数据进行分桶,不同于分区是针对存储路径进行分类,分桶是在数据文件中对数据进行划分的一种技术。

分桶是指定某一列,让该列数据按照哈希取模的方式随机、均匀的分发到各个桶文件中。

创建分桶表

-- 分 6 个桶的分桶表
create table bucket_table(col1 int, col2 string)
clustered by(col1) 
into 6 buckets
row format delimited fields terminated by '\t';

加载数据到分桶表中可以使用 load 或者 insert 的方式。

需要注意的是,reduce 的个数设置应该为-1,让 Job 自行决定需要用多少个 reduce 或者将 reduce 的个
数设置为大于等于分桶表的桶数。

对于非常大的数据集,有时用户需要使用的是一个具有代表性的查询结果而不是全部结
果。Hive 可以通过对表进行抽样来满足这个需求。

语法:tablesample(bucket x out of y)

select * from bucket_table tablesample(bucket 1 out of 3 on col1);

y必须是table总共bucket数的倍数或者因子。

上面的语句表示:对于分桶数为 6 的表,总共抽取 6/y = 6/3 = 2 个bucket的数据,

分别为第 x=1 个 bucket 和第 x+3=4 个 bucket 的数据。

本文简单介绍了 hive 的分区,包括如何创建分区表、新建分区和删除分区,还有二级分区和动态分区;以及分桶表,包括分桶表的概念和抽样函数。

持续关注不迷路,转载请注明出处! —— 大数据的奇妙冒险


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK