Hive的分区分桶和数据抽样

文章目录

我们知道,hive中有分区和分桶的概念,在此篇博客中将对hive的分区表和分桶表的常用操作做一个整理。

分区

概念

分区表的本质就是对应HDFS文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件。Hive表的一个分区就是一个子目录。把一个大的数据集根据业务需要切分成一个个小的数据集,在查询时通过查询条件选择所需要的指定的分区,这样避免去扫描所有数据文件,大大提升查询的效率。

分区表的操作

创建分区表

sql 复制代码
CREATE TABLE test_partition_table(
    id string,
    name string,
    age int
)
COMMENT '分区测试表'
partitioned by (part_data_id string comment 分区)
STORED AS ORC
;

新建分区

sql 复制代码
ALTER TABLE test_partition_table ADD PARTITION(part_data_id='2025-03-13');

导入数据到指定分区

sh 复制代码
LOAD DATA LOCAL INPATH '/data/test/data.txt' INTO TABLE test_partition_table PARTITION(part_data_id='2025-03-13');

写入数据到指定分区

sql 复制代码
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'
;

删除分区

sql 复制代码
ALTER TABLE test_partition_table DROP PARTITION(part_data_id='2025-03-13');

删除多个分区

sql 复制代码
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')
;

查看分区

sql 复制代码
SHOW PARTITIONS test_partition_table;

查看分区表结构

sql 复制代码
DESC FORMATTED test_partition_table;

动态分区

hive支持动态分区,即在数据写入时根据数据的值动态分配写入到相应的分区中。动态分区的功能默认是关闭的,如果需要使用,则需要设置参数开启。

1. 开启动态分区参数设置

sh 复制代码
SET hive.exec.dynamic.partition=true;

2. 设置为非严格模式

动态分区的模式默认是stric严格模式,表示在必须指定至少一个分区为静态分区,nonstric模式表示允许所有的分区字段都可以使用动态分区。

sh 复制代码
SET hive.exec.dynamic.partition.mode=nonstrict;

3. 设置所有节点可创建的最大分区数

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

sh 复制代码
SET hive.exec.max.dynamic.partitions=1000;

4. 设置单个节点可创建的最大分区数

默认为100,该参数需要根据实际的分区字段的值来指定,比如以日期为分区,一年有365天,每天都有数据,如果将这份数据导入到表中就会报错,因为需要的分区数是365,所以需要根据数据的分布调整该参数的大小。

sh 复制代码
SET hive.exec.max.dynamic.partitions.pernode=1000;

5.设置整个MRJob可创建的最大文件数

该参数的默认值为:100000

sh 复制代码
SET hive.exec.max.created.files=100000;

6. 设置当有空分区产生时是否报错,默认值为false

sh 复制代码
SET hive.error.on.empty.partition=false;

分桶

分区表的本质是在HDFS文件系统中创建目录,如果某一天的数据量非常的巨大,还是有可能导致某些查询扫描的数据量过大,所以可以进一步使用分桶的方式来介绍数据的扫描范围。分桶的本质则是将数据文件切分成指定桶数的小文件,类似与关系型数据库中的分区。

创建分桶表

sql 复制代码
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个桶开始中抽取数据。

sql 复制代码
SELECT * FROM test_partition_table tablesample(bucket 5 out of 10 on name);
相关推荐
Eternity......17 分钟前
spark和hadoop的区别
大数据·hadoop·spark
2401_8712905821 分钟前
spark和Hadoop之间的对比和联系
大数据·hadoop·spark
lqlj22333 小时前
spark和hadoop的对比和联系
大数据·hadoop·spark
睎zyl3 小时前
Spark与Hadoop之间的联系和对比
大数据·hadoop·spark
小白的白是白痴的白4 小时前
4.21 spark和hadoop的区别与联系
大数据·hadoop·spark
哈哈真棒4 小时前
spark和Hadoop的区别与联系
大数据·hadoop·spark
RestCloud5 小时前
2025年五大ETL数据集成工具推荐
数据仓库·etl·数字化转型·数据集成·数据集成平台·informatica·talend
哈哈la5 小时前
spark和hadoop的区别
大数据·hadoop·spark
CONTONUE5 小时前
spark和Hadoop的区别和联系
hadoop·spark
IT成长日记5 小时前
【Hive入门】Hive架构与组件深度解析:从核心组件到生态协同
hive·hadoop·架构·架构与组件