文章目录
我们知道,hive中有分区和分桶的概念,在此篇博客中将对hive的分区表和分桶表的常用操作做一个整理。
分区
概念
分区表的本质就是对应HDFS文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件。Hive表的一个分区就是一个子目录。把一个大的数据集根据业务需要切分成一个个小的数据集,在查询时通过查询条件选择所需要的指定的分区,这样避免去扫描所有数据文件,大大提升查询的效率。
分区表的操作
创建分区表
CREATE TABLE test_partition_table(
id string,
name string,
age int
)
COMMENT '分区测试表'
partitioned by (part_data_id string comment 分区)
STORED AS ORC
;
新建分区
ALTER TABLE test_partition_table ADD PARTITION(part_data_id='2025-03-13');
导入数据到指定分区
LOAD DATA LOCAL INPATH '/data/test/data.txt' INTO TABLE test_partition_table PARTITION(part_data_id='2025-03-13');
写入数据到指定分区
INSERT OVERWRITE TABLE test_partition_table PARTITION(part_data_id='2025-03-13')
SELECT
ID
,NAME
,AGE
FROM test_table
WHERE
PART_DATA_ID='2025-03-13'
;
删除分区
ALTER TABLE test_partition_table DROP PARTITION(part_data_id='2025-03-13');
删除多个分区
ALTER TABLE test_partition_table DROP PARTITION(part_data_id='2025-03-13')
,PARTITION(part_data_id='2025-03-14')
,PARTITION(part_data_id='2025-03-15')
;
查看分区
SHOW PARTITIONS test_partition_table;
查看分区表结构
DESC FORMATTED test_partition_table;
动态分区
hive支持动态分区,即在数据写入时根据数据的值动态分配写入到相应的分区中。动态分区的功能默认是关闭的,如果需要使用,则需要设置参数开启。
1. 开启动态分区参数设置
SET hive.exec.dynamic.partition=true;
2. 设置为非严格模式
动态分区的模式默认是stric严格模式,表示在必须指定至少一个分区为静态分区,nonstric模式表示允许所有的分区字段都可以使用动态分区。
SET hive.exec.dynamic.partition.mode=nonstrict;
3. 设置所有节点可创建的最大分区数
在所有执行MR的节点上 ,最大一共可以创建多少个动态分区,默认是1000个。
SET hive.exec.max.dynamic.partitions=1000;
4. 设置单个节点可创建的最大分区数
默认为100,该参数需要根据实际的分区字段的值来指定,比如以日期为分区,一年有365天,每天都有数据,如果将这份数据导入到表中就会报错,因为需要的分区数是365,所以需要根据数据的分布调整该参数的大小。
SET hive.exec.max.dynamic.partitions.pernode=1000;
5.设置整个MRJob可创建的最大文件数
该参数的默认值为:100000
SET hive.exec.max.created.files=100000;
6. 设置当有空分区产生时是否报错,默认值为false
SET hive.error.on.empty.partition=false;
分桶
分区表的本质是在HDFS文件系统中创建目录,如果某一天的数据量非常的巨大,还是有可能导致某些查询扫描的数据量过大,所以可以进一步使用分桶的方式来介绍数据的扫描范围。分桶的本质则是将数据文件切分成指定桶数的小文件,类似与关系型数据库中的分区。
创建分桶表
CREATE TABLE test_partition_table(
id string,
name string,
age int
)
COMMENT '分区测试表'
partitioned by (part_data_id string comment 分区)
clustered by(name) into 7 buckets
STORED AS ORC
;
抽样
我们在使用数据时,有时候并不想查询所有的数据,只需要其中的一部分,这时候就可以使用抽样函数来实现。
抽样
tablesample(BUCKET X OUT OF Y ON {bucket_col})
按照指定的分桶列,分成Y个桶,并从第X个桶开始中抽取数据。
SELECT * FROM test_partition_table tablesample(bucket 5 out of 10 on name);